Hello Friends
In Investigation of problem I put log messages i.e. printf in
agent_trap.c (in agent directory) in function netsnmp_send_traps
because send_v2trap/ send_easy_trap calls this function
in turn. updated function look as follows (in this i putted some printfs)
int
netsnmp_send_traps(int trap, int specific,
oid * enterprise, int enterprise_length,
netsnmp_variable_list * vars,
char * context, int flags)
{
netsnmp_pdu *template_v1pdu;
netsnmp_pdu *template_v2pdu;
netsnmp_variable_list *vblist = NULL;
netsnmp_variable_list *trap_vb;
netsnmp_variable_list *var;
in_addr_t *pdu_in_addr_t;
u_long uptime;
struct trap_sink *sink;
DEBUGMSGTL(( "trap", "send_trap %d %d ", trap, specific));
DEBUGMSGOID(("trap", enterprise, enterprise_length));
DEBUGMSG(( "trap", "\n"));
printf("\nAt Intial stage 1\n");
if (vars) {
vblist = snmp_clone_varbind( vars );
if (!vblist) {
snmp_log(LOG_WARNING,
"send_trap: failed to clone varbind list\n");
printf("\n\ Faile 1 \n");
return -1;
}
}
printf("\nAt stage 2\n");
if ( trap == -1 ) {
printf("\nAt stage 2.1\n");
/*
* Construct the SNMPv2-style notification PDU
*/
if (!vblist) {
snmp_log(LOG_WARNING,
"send_trap: called with NULL v2 information\n");
printf("\n\ Faile 2 \n");
return -1;
}
template_v2pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
if (!template_v2pdu) {
snmp_log(LOG_WARNING,
"send_trap: failed to construct v2 template PDU\n");
snmp_free_varbind(vblist);
printf("\n\ Faile 3 \n");
return -1;
}
printf("\nAt stage 2.2\n");
/*
* Check the varbind list we've been given.
* If it starts with a 'sysUptime.0' varbind, then use that.
* Otherwise, prepend a suitable 'sysUptime.0' varbind.
*/
if (!snmp_oid_compare( vblist->name, vblist->name_length,
sysuptime_oid, sysuptime_oid_len )) {
template_v2pdu->variables = vblist;
trap_vb = vblist->next_variable;
} else {
uptime = netsnmp_get_agent_uptime();
var = NULL;
snmp_varlist_add_variable( &var,
sysuptime_oid, sysuptime_oid_len,
ASN_TIMETICKS, (u_char*)&uptime, sizeof(uptime));
if (!var) {
snmp_log(LOG_WARNING,
"send_trap: failed to insert sysUptime varbind\n");
snmp_free_pdu(template_v2pdu);
snmp_free_varbind(vblist);
printf("\n\ Faile 4 \n");
return -1;
}
printf("\nAt stage 2.3\n");
template_v2pdu->variables = var;
var->next_variable = vblist;
trap_vb = vblist;
}
printf("\nAt stage 2.4\n");
/*
* 'trap_vb' should point to the snmpTrapOID.0 varbind,
* identifying the requested trap. If not then bomb out.
* If it's a 'standard' trap, then we need to append an
* snmpEnterprise varbind (if there isn't already one).
*/
if (!trap_vb ||
snmp_oid_compare(trap_vb->name, trap_vb->name_length,
snmptrap_oid, snmptrap_oid_len)) {
snmp_log(LOG_WARNING,
"send_trap: no v2 trapOID varbind provided\n");
snmp_free_pdu(template_v2pdu);
printf("\n\ Faile 5 \n");
return -1;
}
printf("\nAt stage 2.5\n");
printf("\nAt stage 4\n");
if (!snmp_oid_compare(vblist->val.objid, OID_LENGTH(trap_prefix),
trap_prefix, OID_LENGTH(trap_prefix))) {
var = find_varbind_in_list( template_v2pdu->variables,
snmptrapenterprise_oid,
snmptrapenterprise_oid_len);
if (!var &&
!snmp_varlist_add_variable( &(template_v2pdu->variables),
snmptrapenterprise_oid, snmptrapenterprise_oid_len,
ASN_OBJECT_ID,
(char*)enterprise, enterprise_length*sizeof(oid))) {
snmp_log(LOG_WARNING,
"send_trap: failed to add snmpEnterprise to v2
trap\n");
snmp_free_pdu(template_v2pdu);
printf("\n\ Faile 6 \n");
return -1;
}
}
printf("\nAt stage 2.6\n");
/*
* If everything's OK, convert the v2 template into an SNMPv1 trap
PDU.
*/
template_v1pdu = convert_v2pdu_to_v1( template_v2pdu );
if (!template_v1pdu) {
snmp_log(LOG_WARNING,
"send_trap: failed to convert v2->v1 template PDU\n");
snmp_free_pdu(template_v2pdu);
printf("\n\ Faile 7 \n");
return -1;
}
printf("\nStage 2 end\n");
} else {
printf("\nAt stage 3\n");
/*
* Construct the SNMPv1 trap PDU....
*/
template_v1pdu = snmp_pdu_create(SNMP_MSG_TRAP);
if (!template_v1pdu) {
snmp_log(LOG_WARNING,
"send_trap: failed to construct v1 template PDU\n");
snmp_free_varbind(vblist);
printf("\n\ Faile 8 \n");
return -1;
}
template_v1pdu->trap_type = trap;
template_v1pdu->specific_type = specific;
template_v1pdu->time = netsnmp_get_agent_uptime();
printf("\nAt stage 3.1\n");
if (snmp_clone_mem((void **) &template_v1pdu->enterprise,
enterprise, enterprise_length * sizeof(oid))) {
snmp_log(LOG_WARNING,
"send_trap: failed to set v1 enterprise OID\n");
snmp_free_varbind(vblist);
snmp_free_pdu(template_v1pdu);
printf("\n\ Faile 8 \n");
return -1;
}
template_v1pdu->enterprise_length = enterprise_length;
template_v1pdu->flags |= UCD_MSG_FLAG_FORCE_PDU_COPY;
template_v1pdu->variables = vblist;
/*
* ... and convert it into an SNMPv2-style notification PDU.
*/
printf("\nAt stage 3.2\n");
template_v2pdu = convert_v1pdu_to_v2( template_v1pdu );
if (!template_v2pdu) {
snmp_log(LOG_WARNING,
"send_trap: failed to convert v1->v2 template PDU\n");
snmp_free_pdu(template_v1pdu);
printf("\n\ Faile 10 \n");
return -1;
}
printf("\nCompleted stage 3\n");
}
/*
* Check whether we're ignoring authFail traps
*/
printf("\nAt stage 4\n");
if (template_v1pdu->trap_type == SNMP_TRAP_AUTHFAIL &&
snmp_enableauthentraps == SNMP_AUTHENTICATED_TRAPS_DISABLED) {
snmp_free_pdu(template_v1pdu);
snmp_free_pdu(template_v2pdu);
return 0;
}
/*
* Ensure that the v1 trap PDU includes the local IP address
*/
printf("\nAt stage 5\n");
pdu_in_addr_t = (in_addr_t *) template_v1pdu->agent_addr;
*pdu_in_addr_t = get_myaddr();
/*
* Now loop through the list of trap sinks
* and call the trap callback routines,
* providing an appropriately formatted PDU in each case
*/
printf("\nAt stage 6\n");
// My comments
// As far as i understand This for loop
// sends trap to main agent, & when I see log messages
// this for loop never get execute means
// Value of sinks variable is NULL so no trap send by process
// so my subagent code call send_v2trap but
// send_v2trap has return value void so user never come to know
// weather trap send by API or not
for (sink = sinks; sink; sink = sink->next) {
printf("\nAt stage 6.1 loop \n");
#ifndef NETSNMP_DISABLE_SNMPV1
if (sink->version == SNMP_VERSION_1) {
printf("\n\ Sending trap v1 \n");
send_trap_to_sess(sink->sesp, template_v1pdu);
} else {
#endif
printf("\n\ Sending trap v2 \n");
template_v2pdu->command = sink->pdutype;
send_trap_to_sess(sink->sesp, template_v2pdu);
#ifndef NETSNMP_DISABLE_SNMPV1
}
#endif
}
printf("\nAt stage 7\n");
snmp_call_callbacks(SNMP_CALLBACK_APPLICATION,
SNMPD_CALLBACK_SEND_TRAP1, template_v1pdu);
snmp_call_callbacks(SNMP_CALLBACK_APPLICATION,
SNMPD_CALLBACK_SEND_TRAP2, template_v2pdu);
snmp_free_pdu(template_v1pdu);
snmp_free_pdu(template_v2pdu);
printf("\nAt stage 8\n");
printf("\n\ returning from netsnmp_send_traps \n");
return 0;
}
According to my comment in above code,
Sinks variable is NULL, this is global variable in agent_trap.c
& this variable fill(updated) by function "add_trap_session" located in same
file i.e. agent_trap.c
when I am looking at code add_trap_session function get call by
function snmpd_parse_config_trapsess, and
snmpd_parse_config_trapsess function used in
init_agent_read_config function located in agent_read_config.c
(libagent directory) & init_agent_read_config function also get call
by init_agent (located in snmp_vars.c).
So I think problem lies here in init_agent, so Is i am sending Correct
Parameter to above function ?
i.e. init_agent("sub-agent"); like this
I tried like this also init_agent("c:\\usr\\etc\\snmp\\snmpd.conf");
still trap are not get send by subagent.
So what is problem ?
Please give me any clue so i investigate problem.
Thanks in advance Friends
Regards
Bhushan E. Sonawane
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders