/// <summary>Copy values from another Pdu class.</summary> /// <param name="value"><see cref="Pdu"/> cast as AsnType</param> /// <exception cref="ArgumentNullException">Thrown when received argument is null</exception> public void Set(AsnType value) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (value is Pdu pdu) { Type = pdu.Type; requestId.Value = pdu.RequestId; if (Type == EPduType.GetBulk) { NonRepeaters = pdu.NonRepeaters; MaxRepetitions = pdu.MaxRepetitions; } else { ErrorStatus = pdu.ErrorStatus; ErrorIndex = pdu.ErrorIndex; } VbList.Clear(); foreach (Vb v in pdu.VbList) { VbList.Add((Vb)v.Clone()); } } else { throw new ArgumentNullException(nameof(value), "Argument is not an Oid class"); } }
/// <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) { byte asnType = ParseHeader(buffer, ref offset, out int 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 VbList.Clear(); offset = VbList.Decode(buffer, offset); return(offset); }
/// <summary>Set VbList</summary> /// <remarks> /// Copy variable bindings from argument <see cref="VbCollection"/> into this classes variable /// binding collection /// </remarks> /// <param name="value"><see cref="VbCollection"/> to copy variable bindings from</param> public void SetVbList(VbCollection value) { VbList.Clear(); foreach (Vb v in value) { VbList.Add(v); } }
/// <summary>Decode BER encoded Pdu</summary> /// <remarks> /// Decodes the protocol data unit from the passed buffer. If an error /// occurs during the decoding sequence then an AsnDecodingException is /// thrown by the method. The value is decoded using the AsnEncoder /// passed to the object. /// </remarks> /// <param name="buffer">BER encoded buffer</param> /// <param name="offset">The offset byte to begin decoding</param> /// <returns>Buffer position after the decoded value</returns> /// <exception cref="OverflowException">Thrown when header points to more data then is available.</exception> public override int Decode(byte[] buffer, int offset) { byte asnType = ParseHeader(buffer, ref offset, out int headerLength); if (offset + headerLength > buffer.Length) { throw new OverflowException("Insufficient data in packet"); } base.Type = asnType; // request id offset = requestId.Decode(buffer, offset); // error status offset = errorStatus.Decode(buffer, offset); // error index offset = errorIndex.Decode(buffer, offset); // clean out the current variables VbList.Clear(); // decode the Variable binding collection offset = VbList.Decode(buffer, offset); // if Pdu is an SNMP version 2 TRAP, remove sysUpTime and trapObjectID from the VarBinds array if (Type == EPduType.V2Trap || Type == EPduType.Inform) { if (VbList.Count > 0) { if (VbList[0].Oid.Equals(SnmpConstants.SysUpTime)) { TrapSysUpTime.Set(VbList[0].Value); VbList.RemoveAt(0); // remove sysUpTime } } if (VbList.Count > 0) { if (VbList[0].Oid.Equals(SnmpConstants.TrapObjectId)) { trapObjectID.Set((Oid)VbList[0].Value); VbList.RemoveAt(0); // remove sysUpTime } } } return(offset); }
/// <summary>Reset VbList.</summary> /// <remarks>Remove all entries in the VbList collections.</remarks> public void Reset() { VbList.Clear(); errorStatus.Value = 0; errorIndex.Value = 0; if (requestId.Value == int.MaxValue) { requestId.Value = 1; } else { requestId.Value = requestId.Value + 1; } trapObjectID.Reset(); TrapSysUpTime.Value = 0; }
/// <summary> /// Initialize the class with values from another <see cref="TrapPdu"/> class. /// </summary> /// <param name="second">TrapPdu class whose values are used to initialize this class.</param> public void Set(TrapPdu second) { if (second != null) { _enterprise.Set(second._enterprise); _agentAddr.Set(second._agentAddr); _generic.Value = second.Generic; _specific.Value = second.Specific; _timeStamp.Value = second.TimeStamp; VbList.Clear(); for (int x = 0; x < second.VbList.Count; x++) { VbList = (VbCollection)second.VbList.Clone(); } } else { throw new ArgumentException("Invalid argument type.", "value"); } }