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

#include "sctpTables_common.h"

/*
 * function declarations 
 */
void            init_sctpLookupRemPrimIPAddrTable(void);
void            shutdown_sctpLookupRemPrimIPAddrTable(void);
void            initialize_table_sctpLookupRemPrimIPAddrTable(void);
Netsnmp_Node_Handler sctpLookupRemPrimIPAddrTable_handler;

/*
 * column number definitions for table sctpLookupRemPrimIPAddrTable 
 */
#define COLUMN_SCTPLOOKUPREMPRIMIPADDRSTARTTIME		1

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

    /*
     * Index values 
     */
    u_long          sctpAssocRemPrimAddrType;
    char            sctpAssocRemPrimAddr[SCTP_IPADDRESS_SIZE];
    u_long          sctpAssocRemPrimAddr_len;
    u_long          sctpAssocId;

    /*
     * Column values 
     */
    u_long          sctpLookupRemPrimIPAddrStartTime;

    int             valid;
};

sctpLookupRemPrimIPAddrTable_entry *
sctpLookupRemPrimIPAddrTable_entry_create(void);

int
sctpLookupRemPrimIPAddrTable_entry_update_index (sctpLookupRemPrimIPAddrTable_entry
                                                  * entry);

void
sctpLookupRemPrimIPAddrTable_entry_copy(sctpLookupRemPrimIPAddrTable_entry
                                        * from,
                                        sctpLookupRemPrimIPAddrTable_entry
                                        * to);

void
sctpLookupRemPrimIPAddrTable_entry_free(sctpLookupRemPrimIPAddrTable_entry
                                        * entry);

void
sctpLookupRemPrimIPAddrTable_container_clear(netsnmp_container *container);

#endif                          /* SCTPLOOKUPREMPRIMIPADDRTABLE_H */
