/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 12088 $ of $
 *
 * $Id:$
 *
 * @file dot3StatsTable_data_get.h
 *
 * @addtogroup get
 *
 * Prototypes for get functions
 *
 * @{
 */
#ifndef DOT3STATSTABLE_DATA_GET_H
#define DOT3STATSTABLE_DATA_GET_H

#ifdef __cplusplus
extern          "C" {
#endif

    /*
     *********************************************************************
     * GET function declarations
     */

    /*
     *********************************************************************
     * GET Table declarations
     */
/**********************************************************************
 **********************************************************************
 ***
 *** Table dot3StatsTable
 ***
 **********************************************************************
 **********************************************************************/
    /*
     * EtherLike-MIB::dot3StatsTable is subid 2 of dot3.
     * Its status is Current.
     * OID: .1.3.6.1.2.1.10.7.2, length: 9
     */
    /*
     * indexes
     */

    int             dot3StatsAlignmentErrors_get(dot3StatsTable_rowreq_ctx
                                                 * rowreq_ctx,
                                                 u_long *
                                                 dot3StatsAlignmentErrors_val_ptr);
    int             dot3StatsFCSErrors_get(dot3StatsTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           dot3StatsFCSErrors_val_ptr);
    int            
        dot3StatsSingleCollisionFrames_get(dot3StatsTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           dot3StatsSingleCollisionFrames_val_ptr);
    int            
        dot3StatsMultipleCollisionFrames_get(dot3StatsTable_rowreq_ctx *
                                             rowreq_ctx,
                                             u_long *
                                             dot3StatsMultipleCollisionFrames_val_ptr);
    int             dot3StatsSQETestErrors_get(dot3StatsTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long *
                                               dot3StatsSQETestErrors_val_ptr);
    int            
        dot3StatsDeferredTransmissions_get(dot3StatsTable_rowreq_ctx *
                                           rowreq_ctx,
                                           u_long *
                                           dot3StatsDeferredTransmissions_val_ptr);
    int             dot3StatsLateCollisions_get(dot3StatsTable_rowreq_ctx *
                                                rowreq_ctx,
                                                u_long *
                                                dot3StatsLateCollisions_val_ptr);
    int            
        dot3StatsExcessiveCollisions_get(dot3StatsTable_rowreq_ctx *
                                         rowreq_ctx,
                                         u_long *
                                         dot3StatsExcessiveCollisions_val_ptr);
    int            
        dot3StatsInternalMacTransmitErrors_get(dot3StatsTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long *
                                               dot3StatsInternalMacTransmitErrors_val_ptr);
    int            
        dot3StatsCarrierSenseErrors_get(dot3StatsTable_rowreq_ctx *
                                        rowreq_ctx,
                                        u_long *
                                        dot3StatsCarrierSenseErrors_val_ptr);
    int             dot3StatsFrameTooLongs_get(dot3StatsTable_rowreq_ctx *
                                               rowreq_ctx,
                                               u_long *
                                               dot3StatsFrameTooLongs_val_ptr);
    int            
        dot3StatsInternalMacReceiveErrors_get(dot3StatsTable_rowreq_ctx *
                                              rowreq_ctx,
                                              u_long *
                                              dot3StatsInternalMacReceiveErrors_val_ptr);
    int             dot3StatsEtherChipSet_get(dot3StatsTable_rowreq_ctx *
                                              rowreq_ctx,
                                              oid **
                                              dot3StatsEtherChipSet_val_ptr_ptr,
                                              size_t
                                              *dot3StatsEtherChipSet_val_ptr_len_ptr);
    int             dot3StatsSymbolErrors_get(dot3StatsTable_rowreq_ctx *
                                              rowreq_ctx,
                                              u_long *
                                              dot3StatsSymbolErrors_val_ptr);
    int             dot3StatsDuplexStatus_get(dot3StatsTable_rowreq_ctx *
                                              rowreq_ctx,
                                              u_long *
                                              dot3StatsDuplexStatus_val_ptr);
    int            
        dot3StatsRateControlAbility_get(dot3StatsTable_rowreq_ctx *
                                        rowreq_ctx,
                                        u_long *
                                        dot3StatsRateControlAbility_val_ptr);
    int            
        dot3StatsRateControlStatus_get(dot3StatsTable_rowreq_ctx *
                                       rowreq_ctx,
                                       u_long *
                                       dot3StatsRateControlStatus_val_ptr);


    int            
        dot3StatsTable_indexes_set_tbl_idx(dot3StatsTable_mib_index *
                                           tbl_idx,
                                           long dot3StatsIndex_val);
    int             dot3StatsTable_indexes_set(dot3StatsTable_rowreq_ctx *
                                               rowreq_ctx,
                                               long dot3StatsIndex_val);




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