/// <summary>Decode BER encoded variable binding. /// </summary> /// <param name="buffer">BER encoded buffer /// </param> /// <param name="offset">Offset in the data buffer from where to start decoding. Offset is /// passed by reference and will contain the offset of the byte immediately after the parsed /// variable binding. /// </param> /// <returns>Buffer position after the decoded value</returns> public override int decode(byte[] buffer, int offset) { int headerLength; byte asnType = ParseHeader(buffer, ref offset, out headerLength); if (asnType != Type) { throw new SnmpException(string.Format("Invalid ASN.1 type. Expected 0x{0:x2} received 0x{1:x2}", Type, asnType)); } // verify the length if ((buffer.Length - offset) < headerLength) { throw new OverflowException("Buffer underflow error"); } _oid = new Oid(); offset = _oid.decode(buffer, offset); int saveOffset = offset; // Look ahead in the header to see the data type we need to parse asnType = ParseHeader(buffer, ref saveOffset, out headerLength); _value = SnmpConstants.GetSyntaxObject(asnType); if (_value == null) { throw new SnmpDecodingException(String.Format("Invalid ASN.1 type encountered 0x{0:x2}. Unable to continue decoding.", asnType)); } offset = _value.decode(buffer, offset); return(offset); }
/// <summary>Decode BER encoded SNMP version 1 trap packet</summary> /// <param name="buffer">BER encoded buffer</param> /// <param name="offset">Offset in the packet to start decoding from</param> /// <returns>Buffer position after the decoded value.</returns> /// <exception cref="SnmpException">Invalid SNMP Pdu type received. Not an SNMP version 1 Trap PDU.</exception> /// <exception cref="SnmpException">Invalid Variable Binding list encoding.</exception> public override int decode(byte[] buffer, int offset) { int headerLength; byte asnType = ParseHeader(buffer, ref offset, out headerLength); if (asnType != (byte)PduType.Trap) { throw new SnmpException("Invalid PDU type."); } if (headerLength > buffer.Length - offset) { throw new OverflowException("Packet is too short."); } offset = _enterprise.decode(buffer, offset); offset = _agentAddr.decode(buffer, offset); offset = _generic.decode(buffer, offset); offset = _specific.decode(buffer, offset); offset = _timeStamp.decode(buffer, offset); // clean out the current variables _variables.Clear(); offset = _variables.decode(buffer, offset); return(offset); }