[AGENT++] illegal value at RowStatus after commitFailed
Claus Klein
claus.klein at arcormail.de
Sat Apr 11 22:21:56 CEST 2015
Hi Frank,
> On 11 Apr 2015, at 16:26, Frank Fock <fock at agentpp.com> wrote:
>
> Hi Claus,
>
> The code of snmpRowStatus::unset() is correct as it is. If there is no undo value (undo == NULL)
> the undo cannot fail because there is nothing to undo.
OK, I agree.
> The problem with the row creation is caused something else. If the row creation fails, the new
> (intermediate) row has to be deleted (not added) to the table, but that works only if an
> undo value had been set.
That was my expectation.
>
> In your cause this seems not to be happened. Why?
> A possible cause could be an overwriting of the snmpRowStatus::set method in a snmpRowStatus
> sub-class.
> Other causes have to be found or sorted out by debugging the code.
The problem occurred because the call to netSnmpExampleInteger::set() fails (hard coded for demo).
int netSnmpExampleInteger::set(const Vbx& vb)
{
//--AgentGen BEGIN=netSnmpExampleInteger::set
return SNMP_ERROR_AUTH_ERR; //FIXME only for test
//--AgentGen END
#ifdef MIB_TRACE
std::cerr << BOOST_CURRENT_FUNCTION << std::endl; // XXX
#endif // MIB_TRACE
return MibLeaf::set(vb);
}
int netSnmpExampleInteger::commit_set_request(Request* req, int ind)
{
//--AgentGen BEGIN=netSnmpExampleInteger::commit_set_request
return SNMP_ERROR_COMITFAIL; // FIXME READONLY for test!
//--AgentGen END
#ifdef MIB_TRACE
std::cerr << BOOST_CURRENT_FUNCTION << std::endl; // XXX
#endif // MIB_TRACE
int status = MibLeaf::commit_set_request(req, ind);
//--AgentGen BEGIN=netSnmpExampleInteger::commit_set_request2
//--AgentGen END
return status;
}
A general question:
When should I write to the HW, file, driver or what ever is below the MIB entry?
I use the set() method. But in our project, this may fail in some cases!
Best regards
Claus
>
> Best regards,
> Frank
>
>
> Am 08.04.2015 um 23:20 schrieb Claus Klein:
>> Hi all,
>>
>> I found a problem with the table RowStatus and snmpRowStatus::unset():
>>
>> Claus-MBP:AgentPro clausklein$ snmpset -r0 -t10 -v3 -u unsecureUser -n subagent localhost:4700 'netSnmpHostRowStatus."test2"' = createAndGo \
>> 'netSnmpHostAddressType."test2"' = ipv4 'netSnmpHostAddress."test2"' x 7F000002 netSnmpExampleInteger.0 = 1
>> Error in packet.
>> Reason: commitFailed
>> Failed object: NET-SNMP-EXAMPLES-MIB::netSnmpExampleInteger.0
>>
>> Claus-MBP:AgentPro clausklein$ snmptable -Cib -r0 -t10 -v3 -u unsecureUser -n subagent localhost:4700 netSnmpHostsTable
>> SNMP table: NET-SNMP-EXAMPLES-MIB::netSnmpHostsTable
>>
>> index AddressType Address Storage RowStatus
>> \"nmsv6\" ipv6 "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 " nonVolatile active
>> \"test2\" unknown "" nonVolatile 0
>> \"localhost\" ipv6 "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 " nonVolatile active
>> \"broadcasthost\" ipv4 "FF FF FF FF " nonVolatile active
>> Claus-MBP:AgentPro clausklein$
>>
>> The undo ptr is NULL in this case and the row left in an illegal state?
>> By the way, older versions of agent++ lib use this NULL pointer and crash!
>>
>> Is this a BUG or a feature?
>>
>> Should the code be like this:
>> diff --git a/agent++/src/mib.cpp b/agent++/src/mib.cpp
>> index 5d41353..64b57be 100644
>> --- a/agent++/src/mib.cpp
>> +++ b/agent++/src/mib.cpp
>> @@ -668,8 +668,9 @@ int snmpRowStatus::unset()
>> value = undo;
>> undo = 0;
>> }
>> + return SNMP_ERROR_SUCCESS;
>> }
>> - return SNMP_ERROR_SUCCESS;
>> + return SNMP_ERROR_UNDO_FAIL;
>> }
>> /**
>>
>> Best regards
>> Claus
>> _______________________________________________
>> AGENTPP mailing list
>> AGENTPP at agentpp.org
>> https://oosnmp.net/mailman/listinfo/agentpp
>
> --
> ---
> AGENT++
> Maximilian-Kolbe-Str. 10
> 73257 Koengen, Germany
> https://agentpp.com
> Phone: +49 7024 8688230
> Fax: +49 7024 8688231
>
> _______________________________________________
> AGENTPP mailing list
> AGENTPP at agentpp.org
> https://oosnmp.net/mailman/listinfo/agentpp
More information about the AGENTPP
mailing list