/*
 * Note: this file originally auto-generated by mib2c using
 *  $
 */
#ifndef SCTPASSOCREMADDRTABLE_H
#define SCTPASSOCREMADDRTABLE_H

#include "sctpTables_common.h"

/*
 * function declarations 
 */
void            init_sctpAssocRemAddrTable(void);
void            shutdown_sctpAssocRemAddrTable(void);
void            initialize_table_sctpAssocRemAddrTable(void);
Netsnmp_Node_Handler sctpAssocRemAddrTable_handler;

/*
 * column number definitions for table sctpAssocRemAddrTable 
 */
#define COLUMN_SCTPASSOCREMADDRTYPE		1
#define COLUMN_SCTPASSOCREMADDR		2
#define COLUMN_SCTPASSOCREMADDRACTIVE		3
#define COLUMN_SCTPASSOCREMADDRHBACTIVE		4
#define COLUMN_SCTPASSOCREMADDRRTO		5
#define COLUMN_SCTPASSOCREMADDRMAXPATHRTX		6
#define COLUMN_SCTPASSOCREMADDRRTX		7
#define COLUMN_SCTPASSOCREMADDRSTARTTIME		8


#define SCTP_ASSOC_REM_ADDR_TABLE_INDEX_SIZE 100
/** Typical data structure for a row entry */
struct sctpAssocRemAddrTable_entry_s {
    netsnmp_index   oid_index;
    oid             oid_tmp[SCTP_ASSOC_REM_ADDR_TABLE_INDEX_SIZE];

    /*
     * Index values 
     */
    u_long          sctpAssocId;
    u_long          sctpAssocRemAddrType;
    char            sctpAssocRemAddr[SCTP_IPADDRESS_SIZE];
    u_long          sctpAssocRemAddr_len;

    /*
     * Column values 
     */
    long            sctpAssocRemAddrActive;
    long            sctpAssocRemAddrHBActive;
    u_long          sctpAssocRemAddrRTO;
    u_long          sctpAssocRemAddrMaxPathRtx;
    u_long          sctpAssocRemAddrRtx;
    u_long          sctpAssocRemAddrStartTime;

    int             valid;
};

sctpAssocRemAddrTable_entry *sctpAssocRemAddrTable_entry_create(void);
int
sctpAssocRemAddrTable_entry_update_index(sctpAssocRemAddrTable_entry *
                                         entry);
void
sctpAssocRemAddrTable_entry_copy(sctpAssocRemAddrTable_entry * from,
                                 sctpAssocRemAddrTable_entry * to);
void
sctpAssocRemAddrTable_entry_free(sctpAssocRemAddrTable_entry * entry);

void
sctpAssocRemAddrTable_container_clear(netsnmp_container *container);

#endif                          /* SCTPASSOCREMADDRTABLE_H */
