Hi All:
1.
My program need to use "callback" function and pass something back.
So, I use "callback_magic" to store an C++ object address.
So, I can get my C++ object and use it my callback function.
My code looks like:
================================
bool CERSnmpSession::open()
{
.....
m_sessionData.callback = callBack;
m_sessionData.callback_magic = this;
.....
}
int SNMPSession::callBack(
int operation,
struct snmp_session *ses,
int reqid,
struct snmp_pdu *pdu,
void* magic)
{
SNMPSession* ss = static_cast<SNMPSession*>(magic);
.....
}
2.
The above code works well with net-snmp 5.4.4.
But it coredump with net-snmp 5.7.3 while I set correct username & wrong
password to do negative test.
(1).
The reason is that "_sess_process_packet()" (in snmp_api.c in 5.7.3) does:
if (callback == NULL
|| callback(NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE, sp,
pdu->reqid, pdu, magic) == 1) {
if (pdu->command == SNMP_MSG_REPORT) {
if (sp->s_snmp_errno == SNMPERR_NOT_IN_TIME_WINDOW ||
snmpv3_get_report_type(pdu) ==
SNMPERR_NOT_IN_TIME_WINDOW) {
/*
* trigger immediate retry on recoverable Reports
* * (notInTimeWindow), incr_retries == TRUE to prevent
* * inifinite resend
*/
if (rp->retries <= sp->retries) {
snmp_resend_request(slp, rp, TRUE);
break;
} else {
/* We're done with retries, so no longer waiting for a
response */
if (magic) {
((struct synch_state*)magic)->waiting = 0;
}
}
} else {
if (SNMPV3_IGNORE_UNAUTH_REPORTS) {
break;
} else { /* Set the state to no longer be waiting, since
we're done with retries */
if (magic) {
((struct synch_state*)magic)->waiting = 0; ====>
culprit
}
(2).
I compared the same code in 5.4.4, it is:
if (callback == NULL
|| callback(NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE, sp,
pdu->reqid, pdu, magic) == 1) {
if (pdu->command == SNMP_MSG_REPORT) {
if (sp->s_snmp_errno == SNMPERR_NOT_IN_TIME_WINDOW ||
snmpv3_get_report_type(pdu) ==
SNMPERR_NOT_IN_TIME_WINDOW) {
/*
* trigger immediate retry on recoverable Reports
* * (notInTimeWindow), incr_retries == TRUE to prevent
* * inifinite resend
*/
if (rp->retries <= sp->retries) {
snmp_resend_request(slp, rp, TRUE);
break;
}
} else {
if (SNMPV3_IGNORE_UNAUTH_REPORTS) {
break;
}
}
(3).
We can see 5.7.3 has extra "((struct synch_state*)magic)->waiting = 0;" than
5.4.4
3.
Can you please help me:
1). If I want to pass private stuff, shall I use "callback_magic" or "myvoid in
struct snmp_session" to contain it?
I tested by using "myvoid" instead of "callback_magic" to contain my
private call back data. It works fine.
2). Since "callback_magic" was changed since net-snmp 5.6.x, will net-snmp
change "myvoid" in future release?
Thanks and regards
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Net-snmp-users mailing list
Net-snmp-users@lists.sourceforge.net
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users