[SNMP4J] Counting Invalid Traps

Frank Fock fock at agentpp.com
Tue Oct 27 12:37:27 CET 2009


Hi Elise,

Thank you for reporting this bug [SJF-18].
The current snapshot contains a fix for it,
which is slightly different to yours.

Regards,
Frank

Elise Atkins wrote:
> I have used SNMP4J for several years and have been very satisfied. 
> Recently I did some testing to see what happens when invalid V1 traps 
> and snmp requests were received by the snmp4j code. A CounterListner was 
> added to the MessageDispatcherImpl and the number of incoming 
> traps/requests were accurately counted but the number of invalid traps 
> was not. The large majority of traps were silently discarded. After 
> looking at the following code snippet from MessageDispatcherImpl and the 
> MPv1.java code I concluded that when the MPv1 encountered an error it 
> threw an exception that was caught by the catch block near the end of 
> the snippet. The packet is then silently discarded unless the 
> Snmp4JSettings.forwardRuntimeExceptions is true and the 
> TransportMapping  class catches and counts the exception.
> 
> I think that a better solution would be to add the following lines the 
> catch block:
>         CounterEvent event = new CounterEvent(this,
>                                               
> SnmpConstants.snmpInvalidMsgs);
>         fireIncrementCounter(event);
> 
> The packet would be then counted as invalid. I did set the 
> forwardRuntimeExceptions to true and was able to get a count of the 
> invalid packets and all seemed ok until a little later. I also use 
> AgentXSubagent to connect to the snmpd service. When that service was 
> not running or misconfigured and the subagent could not connect, a 
> socket was orphaned and eventually things stopped working because there 
> were too many sockets opened. I fixed that by calling close and 
> disconnect on the subagent when the connect method failed. But I am now 
> worried that having the forwardRuntimeExceptions set to true will cause 
> additional problems down the line.
> 
>   public void processMessage(TransportMapping sourceTransport,
>                              Address incomingAddress,
>                              BERInputStream wholeMessage) {
>     fireIncrementCounter(new CounterEvent(this, SnmpConstants.snmpInPkts));
>     if (!wholeMessage.markSupported()) {
>       String txt = "Message stream must support marks";
>       logger.error(txt);
>       throw new IllegalArgumentException(txt);
>     }
>     try {
>       wholeMessage.mark(16);
>       BER.MutableByte type = new BER.MutableByte();
>       // decode header but do not check length here, because we do only 
> decode
>       // the first 16 bytes.
>       BER.decodeHeader(wholeMessage, type, false);
>       if (type.getValue() != BER.SEQUENCE) {
>         logger.error("ASN.1 parse error (message is not a sequence)");
>         CounterEvent event = new CounterEvent(this,
>                                               
> SnmpConstants.snmpInASNParseErrs);
>         fireIncrementCounter(event);
>       }
>       Integer32 version = new Integer32();
>       version.decodeBER(wholeMessage);
>       MessageProcessingModel mp = 
> getMessageProcessingModel(version.getValue());
>       if (mp == null) {
>         logger.warn("SNMP version "+version+" is not supported");
>         CounterEvent event = new CounterEvent(this,
>                                               
> SnmpConstants.snmpInBadVersions);
>         fireIncrementCounter(event);
>       }
>       else {
>         // reset it
>         wholeMessage.reset();
>         // dispatch it
>         dispatchMessage(sourceTransport, mp, incomingAddress, wholeMessage);
>       }
>     }
>     catch (Exception ex) {
>       logger.error(ex);
>       if (logger.isDebugEnabled()) {
>         ex.printStackTrace();
>       }
>       if (SNMP4JSettings.isFowardRuntimeExceptions()) {
>         throw new RuntimeException(ex);
>       }
>     }
>     catch (OutOfMemoryError oex) {
>       logger.error(oex);
>       if (SNMP4JSettings.isFowardRuntimeExceptions()) {
>         throw oex;
>       }
>     }
>   }
> 
> Sincerely,
> Elise Atkins
> 

-- 
AGENT++
http://www.agentpp.com
http://www.snmp4j.com
http://www.mibexplorer.com
http://www.mibdesigner.com




More information about the SNMP4J mailing list