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

#include "sctpTables_common.h"

/*
 * function declarations 
 */
void            init_sctpLookupRemIPAddrTable(void);
void            shutdown_sctpLookupRemIPAddrTable(void);
void            initialize_table_sctpLookupRemIPAddrTable(void);
void            shutdown_table_sctpLookupRemIPAddrTable(void);
Netsnmp_Node_Handler sctpLookupRemIPAddrTable_handler;

/*
 * column number definitions for table sctpLookupRemIPAddrTable 
 */
#define COLUMN_SCTPLOOKUPREMIPADDRSTARTTIME		1

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

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

    /*
     * Column values 
     */
    u_long          sctpLookupRemIPAddrStartTime;

    int             valid;
};

sctpLookupRemIPAddrTable_entry *
sctpLookupRemIPAddrTable_entry_create(void);

int
sctpLookupRemIPAddrTable_entry_update_index(sctpLookupRemIPAddrTable_entry
                                            * entry);

void
sctpLookupRemIPAddrTable_entry_copy(sctpLookupRemIPAddrTable_entry * from,
                                    sctpLookupRemIPAddrTable_entry * to);

void
sctpLookupRemIPAddrTable_entry_free(sctpLookupRemIPAddrTable_entry *
                                    entry);

void
sctpLookupRemIPAddrTable_container_clear(netsnmp_container *container);

#endif                          /* SCTPLOOKUPREMIPADDRTABLE_H */
