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

#include "sctpTables_common.h"

/*
 * function declarations 
 */
void            init_sctpLookupRemPortTable(void);
void            shutdown_sctpLookupRemPortTable(void);
void            initialize_table_sctpLookupRemPortTable(void);
void            shutdown_table_sctpLookupRemPortTable(void);
Netsnmp_Node_Handler sctpLookupRemPortTable_handler;

/*
 * column number definitions for table sctpLookupRemPortTable 
 */
#define COLUMN_SCTPLOOKUPREMPORTSTARTTIME		1

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

    /*
     * Index values 
     */
    u_long          sctpAssocRemPort;
    u_long          sctpAssocId;

    /*
     * Column values 
     */
    u_long          sctpLookupRemPortStartTime;

    int             valid;
};

sctpLookupRemPortTable_entry *sctpLookupRemPortTable_entry_create(void);

int
sctpLookupRemPortTable_entry_update_index(sctpLookupRemPortTable_entry *
                                          entry);
void
sctpLookupRemPortTable_entry_copy(sctpLookupRemPortTable_entry * from,
                                  sctpLookupRemPortTable_entry * to);
void
sctpLookupRemPortTable_entry_free(sctpLookupRemPortTable_entry * entry);

void
sctpLookupRemPortTable_container_clear(netsnmp_container *container);

#endif                          /* SCTPLOOKUPREMPORTTABLE_H */
