@Override
 protected void validate() {
   //
   // verify the type
   //
   if (m_pdu.typeId() != (byte) (SnmpPduPacket.V2TRAP)) {
     // if not V2 trap, do nothing
     throw new IllegalArgumentException(
         "Received not SNMPv2 Trap from host "
             + getTrapAddress()
             + "PDU Type = "
             + m_pdu.getCommand());
   }
   if (log().isDebugEnabled()) {
     log().debug("V2 trap numVars or pdu length: " + getPduLength());
   }
   if (getPduLength() < 2) // check number of varbinds
   {
     throw new IllegalArgumentException(
         "V2 trap from "
             + getTrapAddress()
             + " IGNORED due to not having the required varbinds.  Have "
             + getPduLength()
             + ", needed 2");
   }
   // The first varbind has the sysUpTime
   // Modify the sysUpTime varbind to add the trailing 0 if it is
   // missing
   // The second varbind has the snmpTrapOID
   // Confirm that these two are present
   //
   String varBindName0 = m_pdu.getVarBindAt(0).getName().toString();
   String varBindName1 = m_pdu.getVarBindAt(1).getName().toString();
   if (varBindName0.equals(V2TrapInformation.EXTREME_SNMP_SYSUPTIME_OID)) {
     log()
         .info(
             "V2 trap from "
                 + getTrapAddress()
                 + " has been corrected due to the sysUptime.0 varbind not having been sent with a trailing 0.\n\tVarbinds received are : "
                 + varBindName0
                 + " and "
                 + varBindName1);
     varBindName0 = V2TrapInformation.SNMP_SYSUPTIME_OID;
   }
   if ((!(varBindName0.equals(V2TrapInformation.SNMP_SYSUPTIME_OID)))
       || (!(varBindName1.equals(V2TrapInformation.SNMP_TRAP_OID)))) {
     throw new IllegalArgumentException(
         "V2 trap from "
             + getTrapAddress()
             + " IGNORED due to not having the required varbinds.\n\tThe first varbind must be sysUpTime.0 and the second snmpTrapOID.0\n\tVarbinds received are : "
             + varBindName0
             + " and "
             + varBindName1);
   }
 }
 @Override
 protected TrapIdentity getTrapIdentity() {
   // Get the value for the snmpTrapOID
   SnmpObjectId snmpTrapOid =
       (SnmpObjectId) m_pdu.getVarBindAt(V2TrapInformation.SNMP_TRAP_OID_INDEX).getValue();
   SnmpObjectId lastVarBindOid = m_pdu.getVarBindAt(getPduLength() - 1).getName();
   SnmpSyntax lastVarBindValue = m_pdu.getVarBindAt(getPduLength() - 1).getValue();
   return new TrapIdentity(
       SnmpObjId.get(snmpTrapOid.getIdentifiers()),
       SnmpObjId.get(lastVarBindOid.getIdentifiers()),
       new JoeSnmpValue(lastVarBindValue));
 }
  @Override
  protected long getTimeStamp() {

    if (log().isDebugEnabled()) {
      log().debug("V2 trap first varbind value: " + m_pdu.getVarBindAt(0).getValue().toString());
    }

    switch (m_pdu.getVarBindAt(V2TrapInformation.SNMP_SYSUPTIME_OID_INDEX).getValue().typeId()) {
      case SnmpSMI.SMI_TIMETICKS:
        log().debug("V2 trap first varbind value is of type TIMETICKS (correct)");
        return ((SnmpTimeTicks)
                m_pdu.getVarBindAt(V2TrapInformation.SNMP_SYSUPTIME_OID_INDEX).getValue())
            .getValue();
      case SnmpSMI.SMI_INTEGER:
        log().debug("V2 trap first varbind value is of type INTEGER, casting to TIMETICKS");
        return ((SnmpInt32)
                m_pdu.getVarBindAt(V2TrapInformation.SNMP_SYSUPTIME_OID_INDEX).getValue())
            .getValue();
      default:
        throw new IllegalArgumentException(
            "V2 trap does not have the required first varbind as TIMETICKS - cannot process trap");
    }
  }
 @Override
 protected int getPduLength() {
   return m_pdu.getLength();
 }
 private SnmpVarBind getVarBindAt(int index) {
   return m_pdu.getVarBindAt(index);
 }