Exemple #1
0
        /// <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");
            }
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
            }
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        /// <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;
        }
Exemple #6
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");
            }
        }