/** * Encodes a <code>Variable</code> to an <code>OutputStream</code>. * * @param outputStream an <code>OutputStream</code>. * @throws IOException if an error occurs while writing to the stream. */ @Override public void encodeBER(OutputStream outputStream) throws IOException { BER.encodeHeader(outputStream, type, getBERPayloadLength()); if (type == PDU.V1TRAP) { enterprise.encodeBER(outputStream); agentAddress.encodeBER(outputStream); genericTrap.encodeBER(outputStream); specificTrap.encodeBER(outputStream); timestamp.encodeBER(outputStream); } else { requestID.encodeBER(outputStream); errorStatus.encodeBER(outputStream); errorIndex.encodeBER(outputStream); } int vbLength = 0; for (VariableBinding variableBinding : variableBindings) { vbLength += variableBinding.getBERLength(); } BER.encodeHeader(outputStream, BER.SEQUENCE, vbLength); for (VariableBinding vb : variableBindings) { if (!isVariableV1(vb.getVariable())) { throw new IOException("Cannot encode Counter64 into a SNMPv1 PDU"); } vb.encodeBER(outputStream); } }
// TODO return OpenMUC value private double getValue(SML_ListEntry entry) { double value = 0; ASNObject obj = entry.getValue().getChoice(); if (obj.getClass().equals(Integer64.class)) { Integer64 val = (Integer64) obj; value = val.getVal(); } else if (obj.getClass().equals(Integer32.class)) { Integer32 val = (Integer32) obj; value = val.getVal(); } else if (obj.getClass().equals(Integer16.class)) { Integer16 val = (Integer16) obj; value = val.getVal(); } else if (obj.getClass().equals(Integer8.class)) { Integer8 val = (Integer8) obj; value = val.getVal(); } else if (obj.getClass().equals(Unsigned64.class)) { Unsigned64 val = (Unsigned64) obj; value = val.getVal(); } else if (obj.getClass().equals(Unsigned32.class)) { Unsigned32 val = (Unsigned32) obj; value = val.getVal(); } else if (obj.getClass().equals(Unsigned16.class)) { Unsigned16 val = (Unsigned16) obj; value = val.getVal(); } else if (obj.getClass().equals(Unsigned8.class)) { Unsigned8 val = (Unsigned8) obj; value = val.getVal(); } else { return Double.NaN; } byte scaler = entry.getScaler().getVal(); return value * Math.pow(10, scaler); }
/** * Decodes a <code>Variable</code> from an <code>InputStream</code>. * * @param inputStream an <code>InputStream</code> containing a BER encoded byte stream. * @throws IOException */ @Override public void decodeBER(BERInputStream inputStream) throws IOException { MutableByte pduType = new MutableByte(); int length = BER.decodeHeader(inputStream, pduType); int pduStartPos = (int) inputStream.getPosition(); switch (pduType.getValue()) { case PDU.SET: case PDU.GET: case PDU.GETNEXT: case PDU.V1TRAP: case PDU.RESPONSE: break; // The following PDU types are not supported by the SNMPv1 standard! case PDU.NOTIFICATION: case PDU.INFORM: if (SNMP4JSettings.isAllowSNMPv2InV1()) { break; } // fall through default: throw new IOException("Unsupported PDU type: " + pduType.getValue()); } this.setType(pduType.getValue()); if (getType() == PDU.V1TRAP) { enterprise.decodeBER(inputStream); agentAddress.decodeBER(inputStream); genericTrap.decodeBER(inputStream); specificTrap.decodeBER(inputStream); timestamp.decodeBER(inputStream); } else { requestID.decodeBER(inputStream); errorStatus.decodeBER(inputStream); errorIndex.decodeBER(inputStream); } // reusing pduType here to save memory ;-) pduType = new BER.MutableByte(); int vbLength = BER.decodeHeader(inputStream, pduType); if (pduType.getValue() != BER.SEQUENCE) { throw new IOException("Encountered invalid tag, SEQUENCE expected: " + pduType.getValue()); } // rest read count int startPos = (int) inputStream.getPosition(); variableBindings = new Vector<>(); while (inputStream.getPosition() - startPos < vbLength) { VariableBinding vb = new VariableBinding(); vb.decodeBER(inputStream); if (!isVariableV1(vb.getVariable())) { throw new MessageException("Counter64 encountered in SNMPv1 PDU " + "(RFC 2576 §4.1.2.1)"); } variableBindings.add(vb); } if (BER.isCheckSequenceLength()) { BER.checkSequenceLength(vbLength, (int) inputStream.getPosition() - startPos, this); BER.checkSequenceLength(length, (int) inputStream.getPosition() - pduStartPos, this); } }
@Override protected int getBERPayloadLengthPDU() { if (getType() != PDU.V1TRAP) { return super.getBERPayloadLengthPDU(); } else { int length = 0; // length for all vbs for (VariableBinding variableBinding : variableBindings) { length += variableBinding.getBERLength(); } length += BER.getBERLengthOfLength(length) + 1; length += agentAddress.getBERLength(); length += enterprise.getBERLength(); length += genericTrap.getBERLength(); length += specificTrap.getBERLength(); length += timestamp.getBERLength(); return length; } }
/** * Gets the specific trap ID. If this value is set, {@link #getGenericTrap()} must return * ENTERPRISE_SPECIFIC(6). * * @return an integer value > 0. * @throws UnsupportedOperationException if the type of this PDU is not {@link PDU#V1TRAP}. */ public int getSpecificTrap() { checkV1TRAP(); return specificTrap.getValue(); }
/** * Gets the generic trap ID. If this value is ENTERPRISE_SPECIFIC(6), then {@link * #getSpecificTrap()} will return the trap ID of the enterprise specific trap. * * @return an Integer32 instance with a value between 0 and 6. * @throws UnsupportedOperationException if the type of this PDU is not {@link PDU#V1TRAP}. */ public int getGenericTrap() { checkV1TRAP(); return genericTrap.getValue(); }