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

#ifdef __cplusplus
extern          "C" {
#endif


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

    /*
     * other required module components 
     */
    /* *INDENT-OFF*  */
config_require(udp-mib/data_access/udp_endpoint)
config_require(udp-mib/udpEndpointTable/udpEndpointTable_interface)
config_require(udp-mib/udpEndpointTable/udpEndpointTable_data_access)
    /* *INDENT-ON*  */

    /*
     * OID, column number and enum definions for udpEndpointTable 
     */
#include "udpEndpointTable_constants.h"

    /*
     *********************************************************************
     * function declarations
     */
    void            init_udpEndpointTable(void);
    void            shutdown_udpEndpointTable(void);

    /*
     *********************************************************************
     * Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table udpEndpointTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * UDP-MIB::udpEndpointTable is subid 7 of udp.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.7.7, 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 udpEndpointTable registration context.
     */
    typedef netsnmp_data_list udpEndpointTable_registration;

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

        /*
         * udpEndpointProcess(8)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/w/e/r/d/h
         */
        u_long          udpEndpointProcess;

    } udpEndpointTable_data;


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

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

        /*
         * udpEndpointLocalAddress(2)/InetAddress/ASN_OCTET_STR/char(char)//L/a/w/e/R/d/h
         */
        /** 128 - 6(other indexes) - oid length(10) = 111 */
        char            udpEndpointLocalAddress[111];
        size_t          udpEndpointLocalAddress_len;

        /*
         * udpEndpointLocalPort(3)/InetPortNumber/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/H
         */
        u_long          udpEndpointLocalPort;

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

        /*
         * udpEndpointRemoteAddress(5)/InetAddress/ASN_OCTET_STR/char(char)//L/a/w/e/R/d/h
         */
        /** 128 - 6(other indexes) - oid length(10) = 111 */
        char            udpEndpointRemoteAddress[111];
        size_t          udpEndpointRemoteAddress_len;

        /*
         * udpEndpointRemotePort(6)/InetPortNumber/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/H
         */
        u_long          udpEndpointRemotePort;

        /*
         * udpEndpointInstance(7)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/h
         */
        u_long          udpEndpointInstance;

        /*
         * udpEndpointProcess(8)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/h
         */
        u_long          udpEndpointProcess;


    } udpEndpointTable_mib_index;

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


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

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

        udpEndpointTable_mib_index tbl_idx;

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

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

    } udpEndpointTable_rowreq_ctx;

    typedef struct udpEndpointTable_ref_rowreq_ctx_s {
        udpEndpointTable_rowreq_ctx *rowreq_ctx;
    } udpEndpointTable_ref_rowreq_ctx;

    /*
     *********************************************************************
     * function prototypes
     */
    int
        udpEndpointTable_pre_request(udpEndpointTable_registration *
                                     user_context);
    int
        udpEndpointTable_post_request(udpEndpointTable_registration *
                                      user_context, int rc);


        udpEndpointTable_rowreq_ctx
        * udpEndpointTable_row_find_by_mib_index(udpEndpointTable_mib_index
                                                 * mib_idx);

    extern const oid      udpEndpointTable_oid[];
    extern const int      udpEndpointTable_oid_size;


#include "udpEndpointTable_interface.h"
#include "udpEndpointTable_data_access.h"
    /*
     *********************************************************************
     * GET function declarations
     */

    /*
     *********************************************************************
     * GET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table udpEndpointTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * UDP-MIB::udpEndpointTable is subid 7 of udp.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.7.7, length: 8
     */
    /*
     * indexes
     */

    int             udpEndpointProcess_get(udpEndpointTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           udpEndpointProcess_val_ptr);


    int
        udpEndpointTable_indexes_set_tbl_idx(udpEndpointTable_mib_index *
                                             tbl_idx,
                                             u_long
                                             udpEndpointLocalAddressType_val,
                                             char
                                             *udpEndpointLocalAddress_val_ptr,
                                             size_t
                                             udpEndpointLocalAddress_val_ptr_len,
                                             u_long
                                             udpEndpointLocalPort_val,
                                             u_long
                                             udpEndpointRemoteAddressType_val,
                                             char
                                             *udpEndpointRemoteAddress_val_ptr,
                                             size_t
                                             udpEndpointRemoteAddress_val_ptr_len,
                                             u_long
                                             udpEndpointRemotePort_val,
                                             u_long
                                             udpEndpointInstance_val,
                                             u_long
                                             udpEndpointProcess_val);
    int
        udpEndpointTable_indexes_set(udpEndpointTable_rowreq_ctx *
                                     rowreq_ctx,
                                     u_long
                                     udpEndpointLocalAddressType_val,
                                     char *udpEndpointLocalAddress_val_ptr,
                                     size_t
                                     udpEndpointLocalAddress_val_ptr_len,
                                     u_long udpEndpointLocalPort_val,
                                     u_long
                                     udpEndpointRemoteAddressType_val, char
                                     *udpEndpointRemoteAddress_val_ptr,
                                     size_t
                                     udpEndpointRemoteAddress_val_ptr_len,
                                     u_long udpEndpointRemotePort_val,
                                     u_long udpEndpointInstance_val,
                                     u_long udpEndpointProcess_val);



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

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


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

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

