Hi Frank, 
Thanks for the quick response. 

I agree that the agent should implement createAndGo in this case.  
Unfortunately I have to emulate a vendor element that doesn't support that and 
I must use the approach described with the single snmpset with createAndWait + 
active. 

If I were to change locally the code to newRow = false as it was in 
SNMP4j-Agent-1.x, are you aware of any problem I will generate in my agent 
outside of the agent not being fully compliant with the RFC2579 standard ?.  

Thanks a lot for your support on this !

best regards, 
Iker


-----Original Message-----
From: Frank Fock [mailto:f...@agentpp.com] 
Sent: Thursday, January 05, 2017 1:14 PM
To: Iker Almandoz <ialman...@assia-inc.com>
Cc: snmp4j@agentpp.org
Subject: Re: [SNMP4J] Single snmpset setting a RowStatus first to createAndWait 
and then to active not working on snmp4j-2.x

Hi Iker,
There was a bug/non-optimal code in SNMP4J-Agent 1.x which has now been 
fixed/improved. SNMP4J-Agent 2.x enforces now standard conformity which means 
you have to use RowStatus createAndGo to set a new row active with a single SET 
PDU.

Hope this helps anyway.

Best regards
Frank

> Am 05.01.2017 um 04:37 schrieb Iker Almandoz <ialman...@assia-inc.com>:
> 
> Hi Frank,
> 
> We have recently upgraded our snmp4j libraries from the 1.x branch to the 2.x 
> newest versions in order to take advantage of the newest versions and have 
> run into the following problem.
> As part of our usage of snmp4j, we simulate different vendors snmp interfaces 
> in order to have a fully automated test suite of our product.
> For one such vendor, one of the scenarios we have to simulate the 
> dynamic row creation where in a single snmp packet, we set the 
> rowStatus first to createAndWait and in the same exact packet to 
> active Assuming the RowStatus OID is 
> SNMPv2-SMI::enterprises.30442.1.2.2.2.5.1.4 and I want to add a new 
> row with ifIndex = 8, I have to be able to do
> 
> snmpset -v2c -c public localhostot 
> SNMPv2-SMI::enterprises.30442.1.2.2.2.5.1.4.8 i 4 ... ( set a bunch of 
> other oIDs on that table to their initial value)... 
> SNMPv2-SMI::enterprises.30442.1.2.2.2.5.1.4.8 i 1
> 
> When using snmp4j-1.x, this was working fine.  I have been able to 
> narrow it down to here In the agent 1.4.3, in DefaultMOTable, we have
> 
>          if (row == null) {
>            // look for already prepared row
>            row = (MOTableRow)
>                getNewRows(request.getRequest()).get(cell.getIndex());
>          }
>          if (row != null) {
>            prepare(request, cell, mcol, row, false);
>            request.completed();
>            return;
>          }
> 
> So when the second RowStatus arrives, the row is found in getNEwRows, and we 
> call prepare with newRow = false.
> This means that when the MoChangeEvent is created, the old value is 
> passed as creation is = false
> 
>      MOChangeEvent changeEvent =
>          new MOChangeEvent(this, new CellProxy(cell),
>                            cell.getCellOID(),
>                            (creation) ? null : row.getValue(cell.getColumn()),
>                            request.getVariableBinding().getVariable(),
>                            true);
> 
> and when the event is processed in the RowStatus class, in 
> beforePrepareMOChange I get a valid currentValue != notExistant so 
> setting it to active works fine
> 
> Now, if I move to agent-2.5.3, the first change in DefaultMoTable becomeso
>          R row = model.getRow(cell.getIndex());
>          boolean newRow = false;
>          if (row == null) {
>            // look for already prepared row
>            row = getNewRows(request.getRequest()).get(cell.getIndex());
>            newRow = true;
>          }
>          if (row != null) {
>            prepare(request, cell, mcol, row, newRow);
>            request.completed();
>          }
> 
> So now, as the getNewRows is returning the row, the MOChangeVent is created 
> with a previous value of null which defaults to notExistant in RowStatus.
> Here, changeEvent.getOldValue() is null, so currentValue = notExistant and 
> newValue = active.
>  public void beforePrepareMOChange(MOChangeEvent changeEvent) {
>    if (changeEvent.getOID().startsWith(oid)) {
>      int currentValue = notExistant;
>      if (changeEvent.getOldValue() instanceof Integer32) {
>        currentValue = ((Integer32) changeEvent.getOldValue()).getValue();
>      }
>      int newValue = ((Integer32) changeEvent.getNewValue()).getValue();
>      boolean ok = false;
>      switch (currentValue) {
> case notExistant:
>          ok = ((newValue == createAndGo) ||
>                (newValue == createAndWait) || (newValue == destroy));
>          break;
> 
> So with those values, I get within this method ok = false and the set request 
> fails.
> 
> Any help/guidance you can give on this topic would be greatly appreciated as 
> this is blocking our move to production with snmp4j-2.5 at this point.
> I can get our software run ok if I replace line 623 in DefaultMOTAble from
>            prepare(request, cell, mcol, row, newRow); to
>            prepare(request, cell, mcol, row, false);
> 
> however, I am not sure whether this is correct or why the newRow 
> variable is now passed instead of false as in 1.x Please let me know if you 
> would need any additional information.
> 
> Best regards,
> Iker
> 
> 
> _______________________________________________
> SNMP4J mailing list
> SNMP4J@agentpp.org
> https://oosnmp.net/mailman/listinfo/snmp4j

_______________________________________________
SNMP4J mailing list
SNMP4J@agentpp.org
https://oosnmp.net/mailman/listinfo/snmp4j

Reply via email to