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