[SNMP4J] Counting Invalid Traps

Frank Fock fock at agentpp.com
Fri Oct 30 18:37:02 CET 2009


Elise,

Where are the code locations where you think errors
are counted twice?

Do you have a RFC pointer that notes that a BER encoding
error must not counted as an invalid message?

Thanks,
Frank

Elise Atkins wrote:
> Frank,
> 
> Thanks for making the change so quickly. I have one nit picky comment. 
> If you have a ASN.1 parse error, it gets counted as an error and then 
> processing continues and the MPv1 class throws an exception and it 
> counted again as an invalid packet. A cleaner solution to prevent double 
> counting would be to add a return after the first counter event is fired 
> or  log it and not count it and continue processing and have the 
> catch(IOException) block count it.
> 
> Thanks,
> Elise
> 
> Frank Fock wrote:
>> 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