/*
 * 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);
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 */
