blob: d5998f00e1598e8e1c7e26c0615098abde53f1f0 [file] [log] [blame]
/*
* snmpEngine.c: implement's the SNMP-FRAMEWORK-MIB.
*/
#include <net-snmp/net-snmp-config.h>
#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 <net-snmp/agent/sysORTable.h>
#include "util_funcs/header_generic.h"
#include "snmpEngine.h"
struct variable2 snmpEngine_variables[] = {
{SNMPENGINEID, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
var_snmpEngine, 1, {1}},
#ifdef NETSNMP_ENABLE_TESTING_CODE
{SNMPENGINEBOOTS, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
var_snmpEngine, 1, {2}},
{SNMPENGINETIME, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
var_snmpEngine, 1, {3}},
#else /* !NETSNMP_ENABLE_TESTING_CODE */
{SNMPENGINEBOOTS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
var_snmpEngine, 1, {2}},
{SNMPENGINETIME, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
var_snmpEngine, 1, {3}},
#endif /* NETSNMP_ENABLE_TESTING_CODE */
{SNMPENGINEMAXMESSAGESIZE, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
var_snmpEngine, 1, {4}},
};
/*
* now load this mib into the agents mib table
*/
oid snmpEngine_variables_oid[] =
{ 1, 3, 6, 1, 6, 3, 10, 2, 1 };
void
register_snmpEngine_scalars(void)
{
REGISTER_MIB("snmpv3/snmpEngine", snmpEngine_variables, variable2,
snmpEngine_variables_oid);
}
void
register_snmpEngine_scalars_context(const char *contextName)
{
register_mib_context("snmpv3/snmpEngine",
(struct variable *) snmpEngine_variables,
sizeof(struct variable2),
sizeof(snmpEngine_variables)/sizeof(struct variable2),
snmpEngine_variables_oid,
sizeof(snmpEngine_variables_oid)/sizeof(oid),
DEFAULT_MIB_PRIORITY, 0, 0, NULL,
contextName, -1, 0);
}
void
init_snmpEngine(void)
{
oid reg[] = { 1, 3, 6, 1, 6, 3, 10, 3, 1, 1 };
REGISTER_SYSOR_ENTRY(reg, "The SNMP Management Architecture MIB.");
register_snmpEngine_scalars();
}
extern struct timeval starttime;
#ifdef NETSNMP_ENABLE_TESTING_CODE
int write_engineBoots(int, u_char *, u_char, size_t, u_char *,
oid *, size_t);
int write_engineTime(int, u_char *, u_char, size_t, u_char *,
oid *, size_t);
#endif /* NETSNMP_ENABLE_TESTING_CODE */
u_char *
var_snmpEngine(struct variable *vp,
oid * name,
size_t * length,
int exact, size_t * var_len, WriteMethod ** write_method)
{
/*
* variables we may use later
*/
static long long_ret;
static unsigned char engineID[SNMP_MAXBUF];
*write_method = (WriteMethod*)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))
return NULL;
/*
* this is where we do the value assignments for the mib results.
*/
switch (vp->magic) {
case SNMPENGINEID:
*var_len = snmpv3_get_engineID(engineID, SNMP_MAXBUF);
/*
* XXX Set ERROR_MSG() upon error?
*/
return (unsigned char *) engineID;
case SNMPENGINEBOOTS:
#ifdef NETSNMP_ENABLE_TESTING_CODE
*write_method = write_engineBoots;
#endif /* NETSNMP_ENABLE_TESTING_CODE */
long_ret = snmpv3_local_snmpEngineBoots();
return (unsigned char *) &long_ret;
case SNMPENGINETIME:
#ifdef NETSNMP_ENABLE_TESTING_CODE
*write_method = write_engineTime;
#endif /* NETSNMP_ENABLE_TESTING_CODE */
long_ret = snmpv3_local_snmpEngineTime();
return (unsigned char *) &long_ret;
case SNMPENGINEMAXMESSAGESIZE:
long_ret = 1500;
return (unsigned char *) &long_ret;
default:
DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_snmpEngine\n",
vp->magic));
}
return NULL;
}
#ifdef NETSNMP_ENABLE_TESTING_CODE
/*
* write_engineBoots():
*
* This is technically not writable a writable mib object, but we
* allow it so we can run some time synchronization tests.
*/
int
write_engineBoots(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)
{
/*
* variables we may use later
*/
static long long_ret;
size_t size;
int bigsize = SNMP_MAXBUF_MEDIUM;
u_char engineIDBuf[SNMP_MAXBUF_MEDIUM];
int engineIDBufLen = 0;
if (var_val_type != ASN_INTEGER) {
DEBUGMSGTL(("snmpEngine",
"write to engineBoots not ASN_INTEGER\n"));
return SNMP_ERR_WRONGTYPE;
}
if (var_val_len > sizeof(long_ret)) {
DEBUGMSGTL(("snmpEngine", "write to engineBoots: bad length\n"));
return SNMP_ERR_WRONGLENGTH;
}
long_ret = *((long *) var_val);
if (action == COMMIT) {
engineIDBufLen =
snmpv3_get_engineID(engineIDBuf, SNMP_MAXBUF_MEDIUM);
/*
* set our local engineTime in the LCD timing cache
*/
snmpv3_set_engineBootsAndTime(long_ret,
snmpv3_local_snmpEngineTime());
set_enginetime(engineIDBuf, engineIDBufLen,
snmpv3_local_snmpEngineBoots(),
snmpv3_local_snmpEngineTime(), TRUE);
}
return SNMP_ERR_NOERROR;
}
/*
* write_engineTime():
*
* This is technically not a writable mib object, but we
* allow it so we can run some time synchronization tests.
*/
int
write_engineTime(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)
{
/*
* variables we may use later
*/
static long long_ret;
size_t size;
int bigsize = SNMP_MAXBUF_MEDIUM;
u_char engineIDBuf[SNMP_MAXBUF_MEDIUM];
int engineIDBufLen = 0;
if (var_val_type != ASN_INTEGER) {
DEBUGMSGTL(("snmpEngine",
"write to engineTime not ASN_INTEGER\n"));
return SNMP_ERR_WRONGTYPE;
}
if (var_val_len > sizeof(long_ret)) {
DEBUGMSGTL(("snmpEngine", "write to engineTime: bad length\n"));
return SNMP_ERR_WRONGLENGTH;
}
long_ret = *((long *) var_val);
if (action == COMMIT) {
engineIDBufLen =
snmpv3_get_engineID(engineIDBuf, SNMP_MAXBUF_MEDIUM);
/*
* set our local engineTime in the LCD timing cache
*/
snmpv3_set_engineBootsAndTime(snmpv3_local_snmpEngineBoots(),
long_ret);
set_enginetime(engineIDBuf, engineIDBufLen,
snmpv3_local_snmpEngineBoots(),
snmpv3_local_snmpEngineTime(), TRUE);
}
return SNMP_ERR_NOERROR;
}
#endif /* NETSNMP_ENABLE_TESTING_CODE */