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

#include "sctpTables_common.h"

/*
 * function declarations 
 */
void            init_sctpAssocLocalAddrTable(void);
void            shutdown_sctpAssocLocalAddrTable(void);
void            initialize_table_sctpAssocLocalAddrTable(void);
void            shutdown_table_sctpAssocLocalAddrTable(void);
Netsnmp_Node_Handler sctpAssocLocalAddrTable_handler;

/*
 * column number definitions for table sctpAssocLocalAddrTable 
 */
#define COLUMN_SCTPASSOCLOCALADDRTYPE		1
#define COLUMN_SCTPASSOCLOCALADDR		2
#define COLUMN_SCTPASSOCLOCALADDRSTARTTIME		3

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

    /*
     * Index values 
     */
    u_long          sctpAssocId;
    u_long          sctpAssocLocalAddrType;
    char            sctpAssocLocalAddr[SCTP_IPADDRESS_SIZE];
    u_long          sctpAssocLocalAddr_len;

    /*
     * Column values 
     */
    u_long          sctpAssocLocalAddrStartTime;

    int             valid;
};

sctpAssocLocalAddrTable_entry *sctpAssocLocalAddrTable_entry_create(void);
int
sctpAssocLocalAddrTable_entry_update_index(sctpAssocLocalAddrTable_entry *
                                           entry);
void
sctpAssocLocalAddrTable_entry_copy(sctpAssocLocalAddrTable_entry * from,
                                   sctpAssocLocalAddrTable_entry * to);
void
 sctpAssocLocalAddrTable_entry_free(sctpAssocLocalAddrTable_entry * entry);

void            sctpAssocLocalAddrTable_container_clear(netsnmp_container
                                                        *container);

#endif                          /* SCTPASSOCLOCALADDRTABLE_H */
