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

#include "sctpTables_common.h"

/*
 * function declarations 
 */
void            init_sctpLookupRemHostNameTable(void);
void            shutdown_sctpLookupRemHostNameTable(void);
void            initialize_table_sctpLookupRemHostNameTable(void);
void            shutdown_table_sctpLookupRemHostNameTable(void);
Netsnmp_Node_Handler sctpLookupRemHostNameTable_handler;

/*
 * column number definitions for table sctpLookupRemHostNameTable 
 */
#define COLUMN_SCTPLOOKUPREMHOSTNAMESTARTTIME		1

#define SCTP_LOOKUP_REM_HOST_NAME_TABLE_INDEX_SIZE 270
/** Typical data structure for a row entry */
struct sctpLookupRemHostNameTable_entry_s {
    netsnmp_index   oid_index;
    oid             oid_tmp[SCTP_LOOKUP_REM_HOST_NAME_TABLE_INDEX_SIZE];

    /*
     * Index values 
     */
    char            sctpAssocRemHostName[SCTP_HOSTNAME_SIZE];
    u_long          sctpAssocRemHostName_len;
    u_long          sctpAssocId;

    /*
     * Column values 
     */
    u_long          sctpLookupRemHostNameStartTime;

    int             valid;
};

sctpLookupRemHostNameTable_entry* 
sctpLookupRemHostNameTable_entry_create(void);

int
sctpLookupRemHostNameTable_entry_update_index(sctpLookupRemHostNameTable_entry *
                                              entry);

void
sctpLookupRemHostNameTable_entry_copy(sctpLookupRemHostNameTable_entry *
                                      from,
                                      sctpLookupRemHostNameTable_entry *
                                      to);

void
sctpLookupRemHostNameTable_entry_free(sctpLookupRemHostNameTable_entry *
                                      entry);

void
sctpLookupRemHostNameTable_container_clear(netsnmp_container *container);

#endif                          /* SCTPLOOKUPREMHOSTNAMETABLE_H */
