Hi,
I am using net-snmp-5.2.1 to buid an snmp agent.
The source code of my agent was created by running mib2c on my MIB files
with mib2c.scalar.conf and mib2c.iterate_access.conf.
The binary code of my agent is linked with the snmp libraries of
net-snmp-5.2.1.
I placed snmpd.conf, snmp.conf under ~/.snmp and my MIB files under
.snmp/mibs
for root and for a normal user.
Then as root (note: normal user would fail), i invoked my agent
(darRecorder) which
was listening on udp:161 and waiting for snmp requests in
agent_check_and_process().
When i (either as root or normal user) tried "snmpget -v 2c -c
public localhost darDeviceType.0",
i got "Timeout: No Response from localhost." (darDeviceType is an
integer)
i turned on debugging in snmp.conf, i got a lot of messages and the
following are the trailing
statements.
dumpv_send: Integer: 1 (0x01)
trace: _snmp_build(): snmp_api.c, 2924:
dumph_send: SNMPv2c Message
trace: netsnmp_udp_send(): snmpUDPDomain.c, 167:
netsnmp_udp: send 47 bytes from 0x818dde9 to UDP: [127.0.0.1]:161 on fd 3
trace: snmp_sess_select_info(): snmp_api.c, 5702:
sess_select: for all sessions: 3 (to in 1138071566.256498 sec)
verbose:sess_select: timer due in 0.999962 sec
verbose:sess_select: setting timer to 0.999962 sec, clear block (was 1)
trace: snmp_sess_select_info(): snmp_api.c, 5702:
sess_select: for all sessions: 3 (to in 1138071566.256498 sec)
verbose:sess_select: timer due *real* soon. 506 usec
verbose:sess_select: setting timer to 0.506 sec, clear block (was 1)
Timeout: No Response from localhost.
It looked like application was sending the right stuff to the agent.
When i turned on debugging on agent (-DALL), it looked like
the agent received the packet, but somehow "handle_darDeviceType()"
did not get invoked. Did i miss something?
Some of the debugging messages of agent follows. And
darRecorder_subagent.c (created by mib2c -c subagent.m2c darRecorder)
is attached.
Thanks for your help very much.
Li-Juen
dumph_recv: Name
dumpx_recv: 06 0C 2B 06 01 04 01 49 17 02 02 02 01 00
dumpv_recv: ObjID: DAR-COMMON::darDeviceType.0
trace: snmp_pdu_parse(): snmp_api.c, 4339:
dumph_recv: Value
trace: init_agent_snmp_session(): snmp_agent.c, 1244:
snmp_agent: agent_sesion 0x9891828 created
trace: init_agent_snmp_session(): snmp_agent.c, 1259:
verbose:asp: asp 0x9891828 reqinfo 0x9891a20 created
trace: snmp_call_callbacks(): callback.c, 205:
callback: START calling callbacks for maj=1 min=5
trace: snmp_call_callbacks(): callback.c, 219:
callback: calling a callback for maj=1 min=5
trace: vacm_in_view(): mibgroup/mibII/vacm_conf.c, 708:
mibII/vacm_vars: vacm_in_view: ver=1, community=public
trace: netsnmp_udp_getSecName(): snmpUDPDomain.c, 1005:
netsnmp_udp_getSecName: no com2sec entries
trace: vacm_in_view(): mibgroup/mibII/vacm_conf.c, 806:
mibII/vacm_vars: vacm_in_view: No security name found
trace: snmp_call_callbacks(): callback.c, 231:
callback: END calling callbacks for maj=1 min=5 (1 called)
trace: netsnmp_send_traps(): agent_trap.c, 616:
trap: send_trap 4 0 NET-SNMP-MIB::netSnmpAgentOIDs.10trace:
netsnmp_send_traps(): agent_trap.c, 618:
trap:
trace: snmp_call_callbacks(): callback.c, 205:
callback: START calling callbacks for maj=1 min=6
trace: snmp_call_callbacks(): callback.c, 231:
callback: END calling callbacks for maj=1 min=6 (0 called)
trace: snmp_call_callbacks(): callback.c, 205:
callback: START calling callbacks for maj=1 min=7
trace: snmp_call_callbacks(): callback.c, 231:
callback: END calling callbacks for maj=1 min=7 (0 called)
trace: netsnmp_remove_and_free_agent_snmp_session(): snmp_agent.c, 1657:
snmp_agent: REMOVE session == 0x9891828
/*
* Note: this file originally auto-generated by mbi2c using
* version : 1.5.2.1 $ of : subagent.m2c,v $
*/
/*
* standard Net-SNMP includes
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
/*
* include our parent header
*/
#include "darDevice.h"
#include "darRecorder.h"
#include "recPartitionTable.h"
#include "recMCAddressTable.h"
#include <signal.h>
static int keep_running;
int32_t get_device_info()
{
return 0;
}
int32_t set_device_info()
{
return 0;
}
int32_t get_recorder_info()
{
return 0;
}
void reset_recorder()
{
return;
}
void set_recorder_enable()
{
return;
}
int32_t set_recorder_info()
{
reset_recorder();
set_recorder_enable();
return 0;
}
/*
get_next_mcaddr_index_str()
{
}
*/
int32_t get_multicast_data()
{
return 0;
}
int32_t get_partition_data()
{
return 0;
}
static RETSIGTYPE
stop_server(int a)
{
keep_running = 0;
}
static void
usage(void)
{
printf
("usage: darRecorder [-D<tokens>] [-f] [-L] [-M] [-H] [LISTENING ADDRESSES]\n"
"\t-f\tDon't fork().\n"
"\t-DTOKEN[,TOKEN,..]\n"
"\t\tTurn on debug for TOKEN(s).\n"
"\t\tWithout any token specified, it prints all tokens\n"
"\t\t(i.e. using 'ALL' for verbose output.).\n"
"\t\tNote: don't put a space between -D and TOKENs.\n"
"\t-H\tDisplay a list of config file directives\n"
"\t\tknown by the agent and then exit.\n"
"\t-M\tRun as a normal SNMP Agent, not an AgentX sub-agent.\n"
"\t-L\tNo log file; print msgs to stderr.\n");
exit(0);
}
int
main(int argc, char **argv)
{
int agentx_subagent = 0; /* SNMP master agent */
/*
* Defs for arg-handling code: handles setting of policy-related variables
*/
int ch;
extern char *optarg;
int dont_fork = 0, use_syslog = 0;
while ((ch = getopt(argc, argv, "D:fHLM")) != EOF)
switch (ch) {
case 'D':
debug_register_tokens(optarg);
snmp_set_do_debugging(1);
break;
case 'f':
dont_fork = 1;
break;
case 'H':
netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1);
init_agent("darRecorder"); /* register our .conf handlers */
init_darRecorder();
init_snmp("darRecorder");
fprintf(stderr, "Configuration directives understood:\n");
read_config_print_usage(" ");
exit(0);
case 'M':
agentx_subagent = 0;
break;
case 'L':
use_syslog = 0; /* use stderr */
break;
default:
fprintf(stderr, "unknown option %c\n", ch);
usage();
}
if (optind < argc) {
int i;
/*
* There are optional transport addresses on the command line.
*/
DEBUGMSGTL(("snmpd/main", "optind %d, argc %d\n", optind, argc));
for (i = optind; i < argc; i++) {
char *c, *astring;
if ((c = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS))) {
astring = malloc(strlen(c) + 2 + strlen(argv[i]));
if (astring == NULL) {
fprintf(stderr, "malloc failure processing argv[%d]\n",
i);
exit(1);
}
sprintf(astring, "%s,%s", c, argv[i]);
netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS, astring);
SNMP_FREE(astring);
} else {
netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS, argv[i]);
}
}
DEBUGMSGTL(("snmpd/main", "port spec: %s\n",
netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS)));
}
/*
* we're an agentx subagent?
*/
if (agentx_subagent) {
/*
* make us a agentx client.
*/
netsnmp_enable_subagent();
}
snmp_disable_log();
if (use_syslog)
snmp_enable_calllog();
else
snmp_enable_stderrlog();
/*
* daemonize
*/
if (!dont_fork) {
int rc = netsnmp_daemonize(1, !use_syslog);
if (rc)
exit(-1);
}
/*
* initialize the agent library
*/
init_agent("darRecorder");
/*
* init darRecorder mib code
*/
init_darDevice();
init_darRecorder();
init_recPartitionTable();
init_recMCAddressTable();
/*
* read darRecorder.conf files.
*/
init_snmp("darRecorder");
/*
* If we're going to be a snmp master agent, initial the ports
*/
if (!agentx_subagent)
init_master_agent(); /* open the port to listen on (defaults to udp:161) */
/*
* In case we recevie a request to stop (kill -TERM or kill -INT)
*/
keep_running = 1;
signal(SIGTERM, stop_server);
signal(SIGINT, stop_server);
/*
* you're main loop here...
*/
while (keep_running) {
/*
* if you use select(), see snmp_select_info() in snmp_api(3)
*/
/*
* --- OR ---
*/
agent_check_and_process(1); /* 0 == don't block */
}
/*
* at shutdown time
*/
snmp_shutdown("darRecorder");
exit(0);
}