[SNMP4J] Strange problem with multithreaded SNMPv3-Scan

Frank Fock fock at agentpp.com
Wed Nov 10 00:03:23 CET 2004


Hi Chris,

What could be the problem cause is your implementation
of the "close()" function. It removes the security model
USM from the security models. Since the close method
is run concurrently, you remove the USM while other
requests are still outstanding. The response cannot be
decoded then (if it is a SNMPv3 request).

Hope this helps.

Best regards,
Frank

chk-world at gmx.de wrote:

>In-Reply-To=24557.1099935606 at www13.gmx.net
>
>Hi Frank and Mathias,
>thanks for your reply to my question. I tried to set the tcp and udp buffer
>size and file-max value to the following on my linux system:
>
>sysctl -w net.core.wmem_max=524287 (was 128k)
>sysctl -w net.core.rmem_max=524287 (was 128k)
>sysctl -w net.core.wmem_default=524287 (was 64k)
>sysctl -w net.core.rmem_default=524287 (was 64k)
>sysctl -w net.core.optmem_max=20480 (was 10k)
>fs.file-max = 91750 (was that high allready)
>
>This doesn't change anything. Also setting to low values doesn't brought
>more errors.
>
>  
>
>>As Mathias already pointed out, increasing the UDP buffer size on your
>>system may help. Without knowing more about your request sending
>>code, it is hard to help more specific.
>>    
>>
>I attached an example at the end of this message.
>If I run more than 4 Threads at the same time I get response = null back
>when doing response=snmp.sendPDU(request, uTarget) from agents who answer
>correctly if using only 4 Threads.
>
>When playing with some timeout values sometimes I get:
>org.snmp4j.MessageException: Message processing model 3 returned error:
>-1402
>
>Best regards and thanks,
>Chris
>
>PS: I'm using a webmailer, so the In-Reply-To doens't get set in the mail,
>sorry for that.
>
>----------------------------
>import java.io.IOException;
>import org.apache.log4j.Level;
>import org.apache.log4j.Logger;
>import org.snmp4j.*;
>import EDU.oswego.cs.dl.util.concurrent.LinkedQueue;
>import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
>
>public class SNMPv3DeviceDiscovery
>{
>  private class RunnableSender implements Runnable
>  {
>    public static final int DEFAULT = 0;
>    
>    String ipAddress = null;
>    OID authProtocol;
>    OID privProtocol;
>    OctetString privPassphrase;
>    OctetString authPassphrase;
>    OctetString authoritativeEngineID;
>    OctetString contextEngineID;
>    OctetString contextName = new OctetString();
>    OctetString securityName = new OctetString();
>
>    int version = SnmpConstants.version3;
>    int retries = 1;
>    int timeout = 1500;
>    int pduType = PDU.GET;
>
>    VariableBinding variableBinding;
>    int operation = DEFAULT;
>    Snmp snmp;
>    USM usm = null;
>    PDU response = null;
>    PDU request = null;
>    UserTarget uTarget;
>
>    /* unchanged from SnmpRequest from
>       org/snmp4j/tools/console/SnmpRequest.java */
>    private void printVariableBindings(PDU response) {...}
>    private void printReport(PDU response) {...}
>    
>    private RunnableSender(String ipAddress)
>    {
>      this.ipAddress = ipAddress;
>      variableBinding = new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"));
>      authProtocol = AuthMD5.ID;
>      securityName = new OctetString("user");
>      authPassphrase = new OctetString("authPwd");
>      privPassphrase = new OctetString("privPwd");
>      version = SnmpConstants.version3;
>      privProtocol = PrivDES.ID;
>
>      uTarget = new UserTarget();
>      uTarget.setSecurityLevel(SecurityLevel.AUTH_PRIV);
>      uTarget.setSecurityName(securityName);
>      uTarget.setVersion(version);
>      uTarget.setRetries(retries);
>      uTarget.setTimeout(timeout);
>      uTarget.setAddress(new UdpAddress(ipAddress + "/161"));
>
>      request = new ScopedPDU();
>      request.setType(pduType);
>      request.add(variableBinding);
>    }
>
>    public void run()
>    {
>      try
>      {
>        DefaultUdpTransportMapping dutm = new DefaultUdpTransportMapping();
>        dutm.setAsyncMsgProcessingSupported(false);
>        TransportMapping transport = dutm;
>        
>        snmp = new Snmp(transport);
>        usm = new USM(SecurityProtocols.getInstance(), new
>OctetString(((MPv3) snmp
>           
>.getMessageProcessingModel(MessageProcessingModel.MPv3)).createLocalEngineID()),
>0);
>        SecurityModels.getInstance().addSecurityModel(usm);
>        snmp.getUSM().addUser(securityName,
>            new UsmUser(securityName, authProtocol, authPassphrase,
>privProtocol, privPassphrase));
>        snmp.listen();
>      } catch (IOException e1)
>      {
>        e1.printStackTrace();
>      }
>
>      try
>      {
>        response = snmp.sendPDU(request, uTarget);
>      } catch (IOException e)
>      {
>        e.printStackTrace();
>      } // catch
>
>      if (response == null)
>      {
>        System.out.print("host: " + ipAddress + " --- ");
>        System.out.println("Request timed out.");
>      } else if (response.getType() == PDU.REPORT)
>      {
>        System.out.print("host: " + ipAddress + " --- ");
>        printReport(response);
>      } else
>      {
>        System.out.println("Response received with requestID=" +
>response.getRequestID() + ", errorIndex="
>            + response.getErrorIndex() + ", " + "errorStatus=" +
>response.getErrorStatus());
>        System.out.print("host: " + ipAddress + " --- ");
>        printVariableBindings(response);
>      } // if response
>      close();
>    } // run
>    
> public void close() {
>  try {
>      SecurityModels.getInstance().removeSecurityModel(new
>Integer32(usm.getID()));
>        usm = null;
>        snmp.close();
>      } catch (IOException e2) {
>        e2.printStackTrace();
>      }
>    }
>  } // RunnableSender
>
> public void ipLoop() throws InterruptedException
> {
>  // the second parameter is the maxPoolSize, if this value (and the
>  // minPoolSize are bigger than 4 I get timeouts.
>  PooledExecutor pooledExecutor = new PooledExecutor(new LinkedQueue(), 4);
>  pooledExecutor.setMinimumPoolSize(4);
>   
>  for (int i = 1; i < 10; i++)
>  {
>    pooledExecutor.execute(new RunnableSender("10.137.1." +
>Integer.toString(i)));
>  }//for
> }//ipLoop
>
>  public static void main(String[] args) throws InterruptedException{
>    Logger.getRootLogger().setLevel(Level.OFF);
>    CounterSupport.getInstance().addCounterListener(new
>DefaultCounterListener());
>    SNMPv3DeviceDiscovery snmpRequest = new SNMPv3DeviceDiscovery();
>    snmpRequest.ipLoop();
>    Thread.sleep(20000);
>    System.exit(0);
>  }
>}
>
>  
>





More information about the SNMP4J mailing list