summaryrefslogtreecommitdiff
path: root/agent/mibgroup/mibII/snmp_mib.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/mibII/snmp_mib.c')
-rw-r--r--agent/mibgroup/mibII/snmp_mib.c253
1 files changed, 253 insertions, 0 deletions
diff --git a/agent/mibgroup/mibII/snmp_mib.c b/agent/mibgroup/mibII/snmp_mib.c
new file mode 100644
index 0000000..0b30196
--- /dev/null
+++ b/agent/mibgroup/mibII/snmp_mib.c
@@ -0,0 +1,253 @@
+/*
+ * SNMPv1 MIB group implementation - snmp.c
+ *
+ */
+
+#include <net-snmp/net-snmp-config.h>
+#include <sys/types.h>
+#if HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+#if HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#if HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+#include "util_funcs.h"
+#include "snmp_mib.h"
+#include "sysORTable.h"
+
+
+ /*********************
+ *
+ * Kernel & interface information,
+ * and internal forward declarations
+ *
+ *********************/
+
+extern int snmp_enableauthentraps;
+extern int snmp_enableauthentrapsset;
+int old_snmp_enableauthentraps;
+
+/*********************
+ *
+ * Initialisation & common implementation functions
+ *
+ *********************/
+
+/*
+ * define the structure we're going to ask the agent to register our
+ * information at
+ */
+struct variable1 snmp_variables[] = {
+ {SNMPINPKTS, ASN_COUNTER, RONLY, var_snmp, 1, {1}},
+ {SNMPOUTPKTS, ASN_COUNTER, RONLY, var_snmp, 1, {2}},
+ {SNMPINBADVERSIONS, ASN_COUNTER, RONLY, var_snmp, 1, {3}},
+#if !defined(NETSNMP_DISABLE_SNMPV1) || !defined(NETSNMP_DISABLE_SNMPV2C)
+ {SNMPINBADCOMMUNITYNAMES, ASN_COUNTER, RONLY, var_snmp, 1, {4}},
+ {SNMPINBADCOMMUNITYUSES, ASN_COUNTER, RONLY, var_snmp, 1, {5}},
+#endif /* support for community based SNMP */
+ {SNMPINASNPARSEERRORS, ASN_COUNTER, RONLY, var_snmp, 1, {6}},
+ {SNMPINTOOBIGS, ASN_COUNTER, RONLY, var_snmp, 1, {8}},
+ {SNMPINNOSUCHNAMES, ASN_COUNTER, RONLY, var_snmp, 1, {9}},
+ {SNMPINBADVALUES, ASN_COUNTER, RONLY, var_snmp, 1, {10}},
+ {SNMPINREADONLYS, ASN_COUNTER, RONLY, var_snmp, 1, {11}},
+ {SNMPINGENERRS, ASN_COUNTER, RONLY, var_snmp, 1, {12}},
+ {SNMPINTOTALREQVARS, ASN_COUNTER, RONLY, var_snmp, 1, {13}},
+ {SNMPINTOTALSETVARS, ASN_COUNTER, RONLY, var_snmp, 1, {14}},
+ {SNMPINGETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {15}},
+ {SNMPINGETNEXTS, ASN_COUNTER, RONLY, var_snmp, 1, {16}},
+ {SNMPINSETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {17}},
+ {SNMPINGETRESPONSES, ASN_COUNTER, RONLY, var_snmp, 1, {18}},
+ {SNMPINTRAPS, ASN_COUNTER, RONLY, var_snmp, 1, {19}},
+ {SNMPOUTTOOBIGS, ASN_COUNTER, RONLY, var_snmp, 1, {20}},
+ {SNMPOUTNOSUCHNAMES, ASN_COUNTER, RONLY, var_snmp, 1, {21}},
+ {SNMPOUTBADVALUES, ASN_COUNTER, RONLY, var_snmp, 1, {22}},
+ {SNMPOUTGENERRS, ASN_COUNTER, RONLY, var_snmp, 1, {24}},
+ {SNMPOUTGETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {25}},
+ {SNMPOUTGETNEXTS, ASN_COUNTER, RONLY, var_snmp, 1, {26}},
+ {SNMPOUTSETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {27}},
+ {SNMPOUTGETRESPONSES, ASN_COUNTER, RONLY, var_snmp, 1, {28}},
+ {SNMPOUTTRAPS, ASN_COUNTER, RONLY, var_snmp, 1, {29}},
+ {SNMPENABLEAUTHENTRAPS, ASN_INTEGER, RWRITE, var_snmp, 1, {30}},
+ {SNMPSILENTDROPS, ASN_COUNTER, RONLY, var_snmp, 1, {31}},
+ {SNMPPROXYDROPS, ASN_COUNTER, RONLY, var_snmp, 1, {32}}
+};
+
+/*
+ * Define the OID pointer to the top of the mib tree that we're
+ * registering underneath
+ */
+oid snmp_variables_oid[] = { SNMP_OID_MIB2, 11 };
+#ifdef USING_MIBII_SYSTEM_MIB_MODULE
+extern oid system_module_oid[];
+extern int system_module_oid_len;
+extern int system_module_count;
+#endif
+
+static int
+snmp_enableauthentraps_store(int a, int b, void *c, void *d)
+{
+ char line[SNMP_MAXBUF_SMALL];
+
+ if (snmp_enableauthentrapsset > 0) {
+ snprintf(line, SNMP_MAXBUF_SMALL, "pauthtrapenable %d",
+ snmp_enableauthentraps);
+ snmpd_store_config(line);
+ }
+ return 0;
+}
+
+void
+init_snmp_mib(void)
+{
+ /*
+ * register ourselves with the agent to handle our mib tree
+ */
+ REGISTER_MIB("mibII/snmp", snmp_variables, variable1,
+ snmp_variables_oid);
+
+#ifdef USING_MIBII_SYSTEM_MIB_MODULE
+ if (++system_module_count == 3)
+ REGISTER_SYSOR_TABLE(system_module_oid, system_module_oid_len,
+ "The MIB module for SNMPv2 entities");
+#endif
+ snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
+ snmp_enableauthentraps_store, NULL);
+}
+
+/*
+ * header_snmp(...
+ * Arguments:
+ * vp IN - pointer to variable entry that points here
+ * name IN/OUT - IN/name requested, OUT/name found
+ * length IN/OUT - length of IN/OUT oid's
+ * exact IN - TRUE if an exact match was requested
+ * var_len OUT - length of variable or 0 if function returned
+ * write_method
+ *
+ */
+
+ /*********************
+ *
+ * System specific implementation functions
+ * (actually common!)
+ *
+ *********************/
+
+
+u_char *
+var_snmp(struct variable *vp,
+ oid * name,
+ size_t * length,
+ int exact, size_t * var_len, WriteMethod ** write_method)
+{
+ static long long_ret;
+
+ *write_method = 0; /* assume it isnt writable for the time being */
+ *var_len = sizeof(long_ret); /* assume an integer and change later if not */
+
+ if (header_generic(vp, name, length, exact, var_len, write_method)
+ == MATCH_FAILED)
+ return NULL;
+
+ /*
+ * this is where we do the value assignments for the mib results.
+ */
+ if (vp->magic == SNMPENABLEAUTHENTRAPS) {
+ *write_method = write_snmp;
+ long_return = snmp_enableauthentraps;
+ return (u_char *) & long_return;
+ } else if ((vp->magic >= 1)
+ && (vp->magic <=
+ (STAT_SNMP_STATS_END - STAT_SNMP_STATS_START + 1))) {
+ long_ret =
+ snmp_get_statistic(vp->magic + STAT_SNMP_STATS_START - 1);
+ return (unsigned char *) &long_ret;
+ }
+ return NULL;
+}
+
+/*
+ * only for snmpEnableAuthenTraps:
+ */
+
+int
+write_snmp(int action,
+ u_char * var_val,
+ u_char var_val_type,
+ size_t var_val_len, u_char * statP, oid * name, size_t name_len)
+{
+ long intval = 0;
+
+ switch (action) {
+ case RESERVE1: /* Check values for acceptability */
+ if (var_val_type != ASN_INTEGER) {
+ DEBUGMSGTL(("mibII/snmp_mib", "%x not integer type",
+ var_val_type));
+ return SNMP_ERR_WRONGTYPE;
+ }
+
+ intval = *((long *) var_val);
+ if (intval != 1 && intval != 2) {
+ DEBUGMSGTL(("mibII/snmp_mib", "not valid %x\n", intval));
+ return SNMP_ERR_WRONGVALUE;
+ }
+ if (snmp_enableauthentrapsset < 0) {
+ /*
+ * The object is set in a read-only configuration file.
+ */
+ return SNMP_ERR_NOTWRITABLE;
+ }
+ break;
+
+ case RESERVE2: /* Allocate memory and similar resources */
+
+ /*
+ * Using static variables, so nothing needs to be done
+ */
+ break;
+
+ case ACTION: /* Perform the SET action (if reversible) */
+
+ /*
+ * Save the old value, in case of UNDO
+ */
+ intval = *((long *) var_val);
+ old_snmp_enableauthentraps = snmp_enableauthentraps;
+ snmp_enableauthentraps = intval;
+ break;
+
+ case UNDO: /* Reverse the SET action and free resources */
+
+ snmp_enableauthentraps = old_snmp_enableauthentraps;
+ break;
+
+ case COMMIT:
+ snmp_enableauthentrapsset = 1;
+ snmp_save_persistent(netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_APPTYPE));
+ (void) snmp_call_callbacks(SNMP_CALLBACK_LIBRARY,
+ SNMP_CALLBACK_STORE_DATA, NULL);
+ snmp_clean_persistent(netsnmp_ds_get_string
+ (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_APPTYPE));
+ break;
+
+ case FREE: /* Free any resources allocated */
+ break;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+/*********************
+ *
+ * Internal implementation functions
+ *
+ *********************/