[SNMP4J] TCP Socket in SYN_RECV when sending V3 traps

Neeraj Vaidya neeraj.vaidya at yahoo.co.in
Wed May 24 09:50:27 CEST 2017


Hi Frank,
Thanks for your reply I will try with UDP and let you know.
We have a use case to just use TCP owing to the large size of the payload I.e. because of MTU limitation of UDP.
My opinion is that atleast the message should be allowed to go out.
Note that this issue does not occur when I send TCP traps using the net-snmp library.

Regards,
Neeraj

Sent from my iPhone

> On 24 May 2017, at 16:44, Frank Fock <fock at agentpp.com> wrote:
> 
> Hi Neeraj,
> 
> A trap is an unconfirmed PDU. Thus, it is send and the application/SNMP API will not wait for any response. 
> In you case, the Java TCP layer accepted the message, but without the sleep statement, the TCP layer will not be able to actually send the message before you close the connection. 
> 
> Summarised it is not a bug in SNMP4J but a shortcoming in your code. Why are you using TCP for traps? UDP will be much better for this use case and you will not observe this issue with UDP.
> 
> Best regards,
> Frank
> 
>> On 23. May 2017, at 20:33, Neeraj Vaidya <neeraj.vaidya at yahoo.co.in> wrote:
>> 
>> Hi,
>> I have written the following code to send v3 traps to a trap collector daemon (specifically snmptrapd from net-snmp library), which is running on a TCP port.
>> The snmptrapd is running on a RHEL server. And my code is also running on that same host.
>> All I am trying at the moment is to include the linkup trapOID and the sysUpTime in the PDU (ScopedPDU to be precise).
>> 
>> In an Eclipse IDE or even by invoking my application via a command line, when I "Run" the application, traps do not get sent out, however, when I "Debug" the application in Eclipse IDE, the traps DO get sent successfully.
>> 
>> Upon analyzing further, I noticed that when I "Run" the application, the application completes (but without sending TRAPS) without any error, however, the socket that got created as a result of the Snmp.send() invocation, is in a SYN_RECV state. 
>> 
>> This lead me to think that it is possible that the ServerThread in the DefaultTcpTransportMapping class is not allowed to complete the 3-way handshake and thus the sending of the message, before the flow moves on to the next statement in the code.
>> 
>> So, I then added a Thread.Sleep of even 10ms, immediately after the Snmp.send() method invocation, and Now the trap gets sent out (both when I "Run" the application via command-line/Eclipse OR even when I debug it in Eclipse).
>> 
>> The code shown below is the one which contains the Thread.Sleep statement and is a working version of the code.
>> 
>> Is this a bug in the SNMP4J library or am I doing something wrong in my code ? Why does the trap not get sent out without adding the Sleep.
>> Shouldn't the TCP connection (& send) be allowed to complete before the code moves on to the next statement in the program ?
>> 
>> ------------------------------------------------ Code Start ------------------------------------------------ 
>> 
>>               Address address = GenericAddress.parse("tcp:rhelhost1/1163");
>> 
>>        try {
>>            TransportMapping transportMapping = new DefaultTcpTransportMapping();
>>            transportMapping.listen();            
>>                    
>>            Snmp snmp = new Snmp(transportMapping);
>> 
>>            USM usm = new USM(SecurityProtocols.getInstance(),
>>                                                      new OctetString(MPv3.createLocalEngineID()), 0);
>>            
>>            SecurityModels.getInstance().addSecurityModel(usm);
>> 
>>            //snmp.listen(); ----> Do I need to use this invocation ??
>> 
>>            byte[] b = (new BigInteger("0102030405",16)).toByteArray();
>> 
>>            snmp.getUSM().addUser(new OctetString("snmp4j"),
>>                    new UsmUser(new OctetString("snmp4j"), AuthMD5.ID, new OctetString("snmp4j"), PrivDES.ID, new OctetString("snmp4j")));
>>            
>>            UserTarget target = new UserTarget();
>>                
>>            target.setAddress(address);
>>            target.setRetries(1);
>>            target.setTimeout(5000);
>>            target.setVersion(SnmpConstants.version3);
>>            target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);
>>            target.setSecurityName(new OctetString("snmp4j"));
>>            
>>            // create the PDU
>>            ScopedPDU pdu = new ScopedPDU();
>>            long sysUpTime = Instant.now().getEpochSecond();
>>            //pdu.add(new VariableBinding(SnmpConstants.sysUpTime),new OctetString(new Date().toString()));
>>            pdu.setType(ScopedPDU.TRAP);            
>>            pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTime)));
>>            pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, SnmpConstants.linkUp));
>>            pdu.setContextEngineID(new OctetString().fromByteArray(b));
>>            snmp.setLocalEngine(b, 0, 0);
>>            // send the PDU            
>>            
>>            ResponseEvent response = null;
>> 
>>            response = snmp.send(pdu, target);
>> 
>>            Thread.sleep(10); // This Sleep somehow allows the entire TCP 3-way handshake to occur without terminating the program 
>> 
>>            snmp.close();            
>> 
>>        } catch (IOException e) {
>>            e.printStackTrace();
>>        } catch (InterruptedException e) {
>>            e.printStackTrace();
>>        }    
>> ------------------------------------------------ Code End  ------------------------------------------------ 
>> 
>> Regards,
>> Neeraj
>> _______________________________________________
>> SNMP4J mailing list
>> SNMP4J at agentpp.org
>> https://oosnmp.net/mailman/listinfo/snmp4j
> 



More information about the SNMP4J mailing list