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