1

I am trying to recieve SNMP v3 traps from a device, using Adventnet.


When getting a trap I see the following AdventNet exception thrown:

Exception while constructing message after receiving PDU. Dropping this PDU received from xxx.xxx.xxx.xxx.  com.adventnet.snmp.snmp2.SnmpException: Parse Header: Incorrect Scoped data

If I monitor the traps using NG-Soft browser the traps are recieved correctly. Here is my code:

private void initV3Parameters(NEData neData) throws InterruptedException
{
    logger.debug("in.");
    try
    {
        logger.debug(".in");

        SnmpAPI m_api = new SnmpAPI();
        m_api.setDebug( true );
        SnmpSession m_session = new SnmpSession(m_api);
        m_session.addSnmpClient(this);
        UDPProtocolOptions m_udpOpt = new UDPProtocolOptions();
        m_udpOpt.setRemoteHost(neData.m_szIpAddress);
        m_session.setProtocolOptions(m_udpOpt);
        try
        {
            m_session.open();
            String message="Succes to bind port: "+session.getLocalPort();
            logger.info(message);
            System.out.println(message);
        }
        catch (Exception ex)
        {
            String message = "Failed to open session - Port in use or permission denied. \n Message-  "+ ex.getMessage() + "\n Will exit from Trap process. ";
            logger.error(message, ex);
            System.err.println(message);
            throw new RuntimeException(message);
        }   

        SnmpEngineEntry engineentry = new SnmpEngineEntry(neData.m_szIpAddress, m_udpOpt.getRemotePort());
        SnmpEngineTable enginetable = m_api.getSnmpEngine();
        enginetable.addEntry(engineentry);
        try
        {
            engineentry.discoverSnmpEngineID(m_session,10000,3);
        }
        catch (Exception e)
        {
            logger.error("Failed to discover snmp EngineID. " + e.getMessage());
            printToLog("failed",neData);
            return;
        }
        USMUserEntry entry = new USMUserEntry(neData.usmUser.getBytes(), engineentry.getEngineID());
        entry.setAuthProtocol(Integer.parseInt(neData.authProtocol));
        entry.setAuthPassword(neData.authPassword.getBytes());
        entry.setPrivProtocol(Integer.parseInt(neData.privProtocol));
        entry.setPrivPassword(neData.privPassword.getBytes());

        byte[] authKey = USMUtils.password_to_key(entry.getAuthProtocol(),
                                                  neData.authPassword.getBytes(),
                                                  neData.authPassword.getBytes().length,
                                                  engineentry.getEngineID());
        entry.setAuthKey(authKey);
        byte[] privKey = USMUtils.password_to_key(entry.getAuthProtocol(),
                                                  neData.privPassword.getBytes(),
                                                  neData.privPassword.getBytes().length,
                                                  engineentry.getEngineID());
        entry.setPrivKey(privKey);
        entry.setEngineEntry(engineentry);
        entry.setSecurityLevel(Snmp3Message.AUTH_PRIV);

        SecurityProvider provider = m_api.getSecurityProvider();
        USMUserTable userTable = (USMUserTable) provider.getTable(3);
        userTable.addEntry(entry);
        entry.timeSynchronize(m_session, m_udpOpt);
        printToLog("success",neData);
    }
    catch (Exception exp)
    {
        logger.error(exp.getMessage()+" for ip = "+neData.m_szIpAddress,exp);
        discoveredDeque.put(neData);
        printToLog("failed",neData);
    }

}

I've also tried Using High-Level API

USMUtils.init_v3_parameters(
                    neData.usmUser,
                    null,
                    Integer.valueOf(neData.authProtocol),
                    neData.authPassword,
                    neData.privPassword,
                    udpOptions,
                    session,
                    false,
                    Integer.valueOf(neData.privProtocol));

In this case I see the trap using public void debugPrint (String debugOutput) and no exception is throwing. But there is nothing in the callback

Any advice will be welcome!!!

yogev levi
  • 369
  • 1
  • 4
  • 21

1 Answers1

0

It turns out that there was a problem with the time synchronization of the device that sends the traps and my code worked perfectly fine.

probably NG-Soft doesn't care from time sync...

I attach my code here in case any of you will need it in the future...

private SnmpSession session;

/**
* Create a listener for trap version 1-2 
*/
        public void trapsListener ()
        {
            logger.debug(".in");

            SnmpAPI api = new SnmpAPI();
    //      api.setDebug( true );
            session = new SnmpSession(api);
            session.addSnmpClient(this);
            UDPProtocolOptions udpOpt = new UDPProtocolOptions();
            udpOpt.setLocalPort(TRAP_PORT);
            session.setProtocolOptions(udpOpt);
            try
            {
                session.open();
                String message="Succes to bind port: "+session.getLocalPort();
                logger.info(message);
                System.out.println(message);
            }
            catch (Exception ex)
            {
                String message = "Failed to open session - Port in use or permission denied. \n Message-  "+ ex.getMessage() + "\n Will exit from Trap process. ";
                logger.error(message, ex);
                System.err.println(message);
                throw new RuntimeException(message);
            }   
        }


/**
* For each new device
* 1) discover the snmp engineID 
* 2) create SnmpEngineEntry and add it to SnmpEngineTable
* 3) create USMUserEntry  and add it to USMUserTable 
* 4) performs time synchronization
**/
    private void initV3Parameters(Device data) throws InterruptedException
    {
        logger.debug("in.");
        try
        {
            UDPProtocolOptions udpOptions = new UDPProtocolOptions();
            udpOptions.setLocalPort(TRAP_PORT);
            udpOptions.setRemoteHost(data.getIpAddress());

            USMUtils.init_v3_parameters(
                    data.getUsmUser(),
                    null,// null means that the SNMPv3 discovery will be activated
                    Integer.valueOf(data.getAuthProtocol()),
                    data.getAuthPassword(),
                    data.getPrivPassword(),
                    udpOptions,
                    session,
                    false,
                    Integer.valueOf(data.getPrivProtocol()));
            printToLog("secsses",data);
        }
        catch (SnmpException exp) {
            logger.error(exp.getMessage()+" for ip = "+data.getIpAddress(),exp);
            printToLog("failed",data);
        }

    }
yogev levi
  • 369
  • 1
  • 4
  • 21