summaryrefslogtreecommitdiff
path: root/agent/mibgroup/sctp-mib/sctpAssocTable.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/sctp-mib/sctpAssocTable.c')
-rw-r--r--agent/mibgroup/sctp-mib/sctpAssocTable.c529
1 files changed, 529 insertions, 0 deletions
diff --git a/agent/mibgroup/sctp-mib/sctpAssocTable.c b/agent/mibgroup/sctp-mib/sctpAssocTable.c
new file mode 100644
index 0000000..9919075
--- /dev/null
+++ b/agent/mibgroup/sctp-mib/sctpAssocTable.c
@@ -0,0 +1,529 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * mib2c -c mib2c.container.conf
+ */
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include <net-snmp/agent/table_container.h>
+#include "sctpAssocTable.h"
+
+static void _cache_free(netsnmp_cache * cache, void *magic);
+static int _cache_load(netsnmp_cache * cache, void *vmagic);
+
+/*
+ * content of the sctpAssocTable
+ */
+static netsnmp_container *sctpAssocTable_container;
+static netsnmp_table_registration_info *table_info;
+
+/** Initializes the sctpAssocTable module */
+void
+init_sctpAssocTable(void)
+{
+ /*
+ * here we initialize all the tables we're planning on supporting
+ */
+ initialize_table_sctpAssocTable();
+}
+
+void
+shutdown_sctpAssocTable(void)
+{
+ shutdown_table_sctpAssocTable();
+}
+
+/** Initialize the sctpAssocTable table by defining its contents and how it's structured */
+void
+initialize_table_sctpAssocTable(void)
+{
+ static oid sctpAssocTable_oid[] = { 1, 3, 6, 1, 2, 1, 104, 1, 3 };
+ size_t sctpAssocTable_oid_len =
+ OID_LENGTH(sctpAssocTable_oid);
+ netsnmp_handler_registration *reg = NULL;
+ netsnmp_mib_handler *handler = NULL;
+ netsnmp_container *container = NULL;
+ netsnmp_cache *cache = NULL;
+
+ reg =
+ netsnmp_create_handler_registration("sctpAssocTable",
+ sctpAssocTable_handler,
+ sctpAssocTable_oid,
+ sctpAssocTable_oid_len,
+ HANDLER_CAN_RWRITE);
+ if (NULL == reg) {
+ snmp_log(LOG_ERR,
+ "error creating handler registration for sctpAssocTable\n");
+ goto bail;
+ }
+ /** should a set on a non-existent row create a new one? */
+ /** reg->modes |= HANDLER_CAN_NOT_CREATE; */
+
+ container = netsnmp_container_find("sctpAssocTable:table_container");
+ if (NULL == container) {
+ snmp_log(LOG_ERR, "error creating container for sctpAssocTable\n");
+ goto bail;
+ }
+ sctpAssocTable_container = container;
+
+ table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
+ if (NULL == table_info) {
+ snmp_log(LOG_ERR,
+ "error allocating table registration for sctpAssocTable\n");
+ goto bail;
+ }
+ netsnmp_table_helper_add_indexes(table_info, ASN_UNSIGNED, /* index: sctpAssocId */
+ 0);
+ table_info->min_column = COLUMN_SCTPASSOCREMHOSTNAME;
+ table_info->max_column = COLUMN_SCTPASSOCDISCONTINUITYTIME;
+
+ /*************************************************
+ *
+ * inject container_table helper
+ */
+ handler = netsnmp_container_table_handler_get(table_info, container,
+ TABLE_CONTAINER_KEY_NETSNMP_INDEX);
+ if (NULL == handler) {
+ snmp_log(LOG_ERR,
+ "error allocating table registration for sctpAssocTable\n");
+ goto bail;
+ }
+ if (SNMPERR_SUCCESS != netsnmp_inject_handler(reg, handler)) {
+ snmp_log(LOG_ERR,
+ "error injecting container_table handler for sctpAssocTable\n");
+ goto bail;
+ }
+ handler = NULL; /* reg has it, will reuse below */
+
+ /*************************************************
+ *
+ * inject cache helper
+ */
+ cache = netsnmp_cache_create(SCTP_TABLES_CACHE_TIMEOUT, /* timeout in seconds */
+ _cache_load, _cache_free,
+ sctpAssocTable_oid,
+ sctpAssocTable_oid_len);
+
+ if (NULL == cache) {
+ snmp_log(LOG_ERR, "error creating cache for sctpAssocTable\n");
+ goto bail;
+ }
+ cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET
+ | NETSNMP_CACHE_AUTO_RELOAD | NETSNMP_CACHE_PRELOAD;
+ cache->magic = container;
+
+ handler = netsnmp_cache_handler_get(cache);
+ if (NULL == handler) {
+ snmp_log(LOG_ERR,
+ "error creating cache handler for sctpAssocTable\n");
+ goto bail;
+ }
+
+ netsnmp_cache_handler_owns_cache(handler);
+
+ if (SNMPERR_SUCCESS != netsnmp_inject_handler(reg, handler)) {
+ snmp_log(LOG_ERR,
+ "error injecting cache handler for sctpAssocTable\n");
+ goto bail;
+ }
+ handler = NULL; /* reg has it */
+
+ /*
+ * register the table
+ */
+ if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+ snmp_log(LOG_ERR,
+ "error registering table handler for sctpAssocTable\n");
+ reg = NULL; /* it was freed inside netsnmp_register_table */
+ goto bail;
+ }
+
+ /*
+ * Initialise the contents of the table here
+ */
+
+
+ return; /* ok */
+
+ /*
+ * Some error occurred during registration. Clean up and bail.
+ */
+ bail: /* not ok */
+
+ if (handler)
+ netsnmp_handler_free(handler);
+
+ if (cache)
+ netsnmp_cache_free(cache);
+
+ if (table_info)
+ netsnmp_table_registration_info_free(table_info);
+
+ if (container)
+ CONTAINER_FREE(container);
+
+ if (reg)
+ netsnmp_handler_registration_free(reg);
+}
+
+void
+shutdown_table_sctpAssocTable(void)
+{
+ if (table_info) {
+ netsnmp_table_registration_info_free(table_info);
+ table_info = NULL;
+ }
+ if (sctpAssocTable_container)
+ sctpAssocTable_container_clear(sctpAssocTable_container);
+}
+
+
+/** handles requests for the sctpAssocTable table */
+int
+sctpAssocTable_handler(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ netsnmp_request_info *request;
+ netsnmp_table_request_info *table_info;
+ sctpAssocTable_entry *table_entry;
+
+ switch (reqinfo->mode) {
+ /*
+ * Read-support (also covers GetNext requests)
+ */
+ case MODE_GET:
+ for (request = requests; request; request = request->next) {
+ if (request->processed)
+ continue;
+ table_entry = (sctpAssocTable_entry *)
+ netsnmp_container_table_extract_context(request);
+ table_info = netsnmp_extract_table_info(request);
+ if ((NULL == table_entry) || (NULL == table_info)) {
+ snmp_log(LOG_ERR,
+ "could not extract table entry or info for sctpAssocTable\n");
+ snmp_set_var_typed_value(request->requestvb,
+ SNMP_ERR_GENERR, NULL, 0);
+ continue;
+ }
+
+ switch (table_info->colnum) {
+ case COLUMN_SCTPASSOCREMHOSTNAME:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ table_entry->sctpAssocRemHostName,
+ table_entry->sctpAssocRemHostName_len);
+ break;
+ case COLUMN_SCTPASSOCLOCALPORT:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_UNSIGNED,
+ table_entry->sctpAssocLocalPort);
+ break;
+ case COLUMN_SCTPASSOCREMPORT:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_UNSIGNED,
+ table_entry->sctpAssocRemPort);
+ break;
+ case COLUMN_SCTPASSOCREMPRIMADDRTYPE:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
+ table_entry->sctpAssocRemPrimAddrType);
+ break;
+ case COLUMN_SCTPASSOCREMPRIMADDR:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ table_entry->sctpAssocRemPrimAddr,
+ table_entry->sctpAssocRemPrimAddr_len);
+ break;
+ case COLUMN_SCTPASSOCHEARTBEATINTERVAL:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_UNSIGNED,
+ table_entry->sctpAssocHeartBeatInterval);
+ break;
+ case COLUMN_SCTPASSOCSTATE:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
+ table_entry->sctpAssocState);
+ break;
+ case COLUMN_SCTPASSOCINSTREAMS:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_UNSIGNED,
+ table_entry->sctpAssocInStreams);
+ break;
+ case COLUMN_SCTPASSOCOUTSTREAMS:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_UNSIGNED,
+ table_entry->sctpAssocOutStreams);
+ break;
+ case COLUMN_SCTPASSOCMAXRETR:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_UNSIGNED,
+ table_entry->sctpAssocMaxRetr);
+ break;
+ case COLUMN_SCTPASSOCPRIMPROCESS:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_UNSIGNED,
+ table_entry->sctpAssocPrimProcess);
+ break;
+ case COLUMN_SCTPASSOCT1EXPIREDS:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb, ASN_COUNTER,
+ table_entry->sctpAssocT1expireds);
+ break;
+ case COLUMN_SCTPASSOCT2EXPIREDS:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb, ASN_COUNTER,
+ table_entry->sctpAssocT2expireds);
+ break;
+ case COLUMN_SCTPASSOCRTXCHUNKS:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb, ASN_COUNTER,
+ table_entry->sctpAssocRtxChunks);
+ break;
+ case COLUMN_SCTPASSOCSTARTTIME:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_TIMETICKS,
+ table_entry->sctpAssocStartTime);
+ break;
+ case COLUMN_SCTPASSOCDISCONTINUITYTIME:
+ if (!table_entry) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ snmp_set_var_typed_integer(request->requestvb,
+ ASN_TIMETICKS,
+ table_entry->sctpAssocDiscontinuityTime);
+ break;
+ default:
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHOBJECT);
+ break;
+ }
+ }
+ break;
+
+ /*
+ * Write-support
+ */
+ case MODE_SET_RESERVE1:
+ for (request = requests; request; request = request->next) {
+ if (request->processed)
+ continue;
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_ERR_NOTWRITABLE);
+ }
+ break;
+
+ case MODE_SET_RESERVE2:
+ case MODE_SET_FREE:
+ case MODE_SET_ACTION:
+ case MODE_SET_UNDO:
+ case MODE_SET_COMMIT:
+ break;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+/**
+ * @internal
+ */
+static int
+_cache_load(netsnmp_cache * cache, void *vmagic)
+{
+ DEBUGMSGTL(("internal:sctpAssocTable:_cache_load", "called\n"));
+
+ if ((NULL == cache) || (NULL == cache->magic)) {
+ snmp_log(LOG_ERR, "invalid cache for sctpAssocTable_cache_load\n");
+ return -1;
+ }
+ /** should only be called for an invalid or expired cache */
+ netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
+
+ return sctpTables_load();
+} /* _cache_load */
+
+/**
+ * @Internal
+ */
+/** remove a row from the table */
+static void
+sctpAssocTable_freeEntry_cb(sctpAssocTable_entry * entry, void *magic)
+{
+
+ sctpAssocTable_entry_free(entry);
+}
+
+/**
+ * @internal
+ */
+static void
+_cache_free(netsnmp_cache * cache, void *magic)
+{
+ netsnmp_container *container;
+
+ DEBUGMSGTL(("internal:sctpAssocTable:_cache_free", "called\n"));
+
+ if ((NULL == cache) || (NULL == cache->magic)) {
+ snmp_log(LOG_ERR, "invalid cache in sctpAssocTable_cache_free\n");
+ return;
+ }
+ container = (netsnmp_container *) cache->magic;
+
+ /*
+ * empty (but don't free) cache here
+ */
+ CONTAINER_CLEAR(container, (netsnmp_container_obj_func *)
+ sctpAssocTable_freeEntry_cb, NULL);
+} /* _cache_free */
+
+sctpAssocTable_entry *
+sctpAssocTable_entry_create(void)
+{
+ sctpAssocTable_entry *entry =
+ SNMP_MALLOC_TYPEDEF(sctpAssocTable_entry);
+ if (entry != NULL) {
+ entry->oid_index.len = SCTP_ASSOC_TABLE_INDEX_SIZE;
+ entry->oid_index.oids = entry->oid_tmp;
+ }
+
+ return entry;
+}
+
+int
+sctpAssocTable_entry_update_index(sctpAssocTable_entry * entry)
+{
+ netsnmp_variable_list var_sctpAssocId;
+ int err = 0;
+
+ /*
+ * prepare the value to be converted
+ */
+ memset(&var_sctpAssocId, 0, sizeof(var_sctpAssocId));
+ var_sctpAssocId.type = ASN_UNSIGNED;
+ var_sctpAssocId.next_variable = NULL;
+ snmp_set_var_value(&var_sctpAssocId, (u_char *) & entry->sctpAssocId,
+ sizeof(entry->sctpAssocId));
+
+ /*
+ * convert it
+ */
+ err =
+ build_oid_noalloc(entry->oid_index.oids, entry->oid_index.len,
+ &entry->oid_index.len, NULL, 0,
+ &var_sctpAssocId);
+ if (err)
+ snmp_log(LOG_ERR, "error %d converting index to oid\n", err);
+
+ /*
+ * release any memory allocated during the conversion
+ */
+ snmp_reset_var_buffers(&var_sctpAssocId);
+
+ return err;
+}
+
+void
+sctpAssocTable_entry_copy(sctpAssocTable_entry * from,
+ sctpAssocTable_entry * to)
+{
+ memcpy(to, from, sizeof(sctpAssocTable_entry));
+ to->oid_index.oids = to->oid_tmp;
+}
+
+
+void
+sctpAssocTable_entry_free(sctpAssocTable_entry * entry)
+{
+ SNMP_FREE(entry);
+}
+
+netsnmp_container *
+sctpAssocTable_get_container(void)
+{
+ return sctpAssocTable_container;
+}
+
+static void
+sctpAssocTable_entry_clear(void *what, void *magic)
+{
+ sctpAssocTable_entry_free(what);
+}
+
+void
+sctpAssocTable_container_clear(netsnmp_container *container)
+{
+ CONTAINER_CLEAR(container, sctpAssocTable_entry_clear, NULL);
+}