Immutable value type to hold Asn1Data
        public void Asn1BigVarBindEncodingTest()
        {
            var varBinds = new VarBind[] {
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 143, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 122, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13456, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1334, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1444, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13, new Asn1TagInfo(Asn1Tag.Integer)),
               new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 10, new Asn1TagInfo(Asn1Tag.Integer)),
            };

            var packet = new SnmpDatagramV2C(
                DateTimeOffset.MinValue,
                "1.1.1.1",
                new SnmpHeader(SnmpVersion.V2C, "Community"),
                varBinds,
                PduType.SNMPv2Trap,
                509000,
                SnmpErrorStatus.TooBig,
                10000);

            var encoded = packet.ToSnmpEncodedByteArray();
            var snmpPack = encoded.ToSnmpDatagram();

            Assert.IsNull(snmpPack.VarBinds[0].Value);
            Assert.AreEqual(1, (long)snmpPack.VarBinds[1].Value);
        }
Beispiel #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpV2cPDU"/> struct with decoupling the reference of varBinds
 /// </summary>
 /// <param name="pduType">Type of the pdu.</param>
 /// <param name="requestId">The request identifier.</param>
 /// <param name="errorStatus">The error status.</param>
 /// <param name="errorIndex">Index of the error.</param>
 /// <param name="varBinds">The variable binds.</param>
 public SnmpV2cPDU(PduType pduType, int requestId, SnmpErrorStatus errorStatus, int errorIndex, VarBind[] varBinds)
 {
     PduType = pduType;
     RequestId = requestId;
     ErrorStatus = errorStatus;
     ErrorIndex = errorIndex;
     VarBinds = new ReadOnlyCollection<VarBind>((VarBind[])varBinds.Clone());
 }
Beispiel #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpV2cPDU"/> struct without decoupling refrence for varbinds.
 /// </summary>
 /// <param name="pduType">Type of the pdu.</param>
 /// <param name="varBinds">The variable binds.</param>
 /// <param name="requestId">The request identifier.</param>
 /// <param name="errorStatus">The error status.</param>
 /// <param name="errorIndex">Index of the error.</param>
 internal SnmpV2cPDU(PduType pduType, VarBind[] varBinds, int requestId, SnmpErrorStatus errorStatus, int errorIndex)
 {
     PduType = pduType;
     VarBinds = new ReadOnlyCollection<VarBind>(varBinds);
     RequestId = requestId;
     ErrorStatus = errorStatus;
     ErrorIndex = errorIndex;
 }
Beispiel #4
0
        /// <summary>
        /// Makes the variable binds.
        /// </summary>
        /// <param name="varBinds">Varbind value.</param>
        /// <param name="key">The key.</param>
        /// <param name="value">The value.</param>
        /// <param name="tag">The asn1 tag.</param>
        /// <param name="varbindCount">The varbind count.</param>
        private static void MakeVarBinds(ref VarBind[] varBinds, uint[] key, object value, Asn1TagInfo tag, int varbindCount)
        {
            int length = varBinds.Length;

            if (varbindCount >= length)
            {
                Array.Resize(ref varBinds, length + 100);
            }

            varBinds[varbindCount] = new VarBind(new ObjectIdentifier(key), value, tag);
        }
Beispiel #5
0
        /// <summary>
        /// Searches the last sub oid with.
        /// </summary>
        /// <param name="subOid">The sub oid.</param>
        /// <param name="varBind">The variable bind.</param>
        /// <param name="varBinds">The variable bind List.</param>
        /// <returns>Boolean value true if subOid is found else false</returns>
        public static bool SearchLastSubOidWith(this ReadOnlyCollection<VarBind> varBinds, ObjectIdentifier subOid, out VarBind varBind)
        {
            bool isFound = false;
            varBind = default(VarBind);
            for (int i = varBinds.Count - 1; i >= 0; i--)
            {
                if (varBinds[i].Oid.IsSubOid(subOid))
                {
                    varBind = varBinds[i];
                    isFound = true;
                    break;
                }
            }

            return isFound;
        }
        /// <summary>
        /// Searches the first sub oid.
        /// </summary>
        /// <param name="subOid">The sub oid.</param>
        /// <param name="varBind">The variable bind.</param>
        /// <param name="varBinds">The variable bind List.</param>
        /// <returns>Boolean value true if subOid is found else false</returns>
        public static bool SearchFirstSubOidWith(this IReadOnlyCollection<VarBind> varBinds, ObjectIdentifier subOid, out VarBind varBind)
        {
            bool isFound = false;
            varBind = default(VarBind);
            foreach (var item in varBinds)
            {
                if (item.Oid.IsSubOid(subOid))
                {
                    varBind = item;
                    isFound = true;
                    break;
                }
            }

            return isFound;
        }
Beispiel #7
0
        /// <summary>
        /// Searches the first sub oid.
        /// </summary>
        /// <param name="subOid">The sub oid.</param>
        /// <param name="varBind">The variable bind.</param>
        /// <returns>Boolean value true if subOid is found else false</returns>
        public bool SearchFirstSubOidWith(ObjectIdentifier subOid, out VarBind varBind)
        {
            bool isFound = false;

            varBind = default(VarBind);
            for (int i = 0; i < VarBinds.Count; i++)
            {
                if (VarBinds[i].Oid.IsSubOid(subOid))
                {
                    varBind = VarBinds[i];
                    isFound = true;
                    break;
                }
            }

            return(isFound);
        }
Beispiel #8
0
        /// <summary>
        /// Reads the variable binds.
        /// </summary>
        /// <param name="bytes">The bytes.</param>
        /// <param name="offset">The offset.</param>
        /// <param name="bytesLength">Length of the bytes.</param>
        /// <returns>
        /// VarBinds
        /// </returns>
        /// <exception cref="System.DataMisalignedException">Bad Data/Mulformated Asn1/Snmp data</exception>
        /// <exception cref="InvalidOperationException">Malformed datagram/Out of sequemce data</exception>
        public static VarBind[] ReadVarBinds(this byte[] bytes, int offset, int bytesLength)
        {
            VarBind[] values       = new VarBind[100];
            int       varbindCount = 0;

            bytesLength += offset;

            while (offset < bytesLength)
            {
                Asn1TagInfo cct    = bytes[offset++].DecodeToClassConstructType();
                int         length = 0;
                offset = ReadLength(bytes, offset, out length);

                if (ConstructType.Primitive != cct.Asn1ConstructType)
                {
                    continue;
                }

                if (cct.Asn1TagType == Asn1Tag.NotAsn1Data || cct.Asn1TagType != Asn1Tag.ObjectIdentifier)
                {
                    throw new DataMisalignedException("Bad Data/Mulformated Asn1/Snmp data");
                }

                uint[] key = ReadOids(bytes, offset, length);
                offset += length;

                // Get [TLV] type, length, value
                cct    = bytes[offset++].DecodeToClassConstructType();
                offset = ReadLength(bytes, offset, out length);
                object value;
                offset = GetVarBindValue(bytes, offset, length, cct, out value);

                //Make varbind
                MakeVarBinds(ref values, key, value, cct, varbindCount++);
            }

            if (varbindCount != values.Length)
            {
                Array.Resize(ref values, varbindCount);
            }

            return(values);
        }
        public void Asn1GaugeEncodingTest()
        {
            var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"),
            506009u, new Asn1TagInfo(Asn1SnmpTag.Gauge));

            var packet = new SnmpDatagramV2C(
                DateTimeOffset.MinValue,
                "1.1.1.1",
                new SnmpHeader(SnmpVersion.V2C, "Community"),
                new[] { sysUpTime },
                PduType.SNMPv2Trap,
                50000,
                SnmpErrorStatus.NoError,
                0);

            var encoded = packet.ToSnmpEncodedByteArray();
            var snmpPack = encoded.ToSnmpDatagram();

            Assert.AreEqual(506009u, (uint)snmpPack.VarBinds[0].Value);
        }
Beispiel #10
0
        /// <summary>
        /// Searches the last sub oid with.
        /// </summary>
        /// <param name="subOid">The sub oid.</param>
        /// <param name="varBind">The variable bind.</param>
        /// <param name="varBinds">The variable bind List.</param>
        /// <returns>Boolean value true if subOid is found else false</returns>
        public static bool SearchLastSubOidWith(this ReadOnlyCollection <VarBind> varBinds, ObjectIdentifier subOid, out VarBind varBind)
        {
            bool isFound = false;

            varBind = default(VarBind);
            for (int i = varBinds.Count - 1; i >= 0; i--)
            {
                if (varBinds[i].Oid.IsSubOid(subOid))
                {
                    varBind = varBinds[i];
                    isFound = true;
                    break;
                }
            }

            return(isFound);
        }
Beispiel #11
0
        /// <summary>
        /// Searches the first sub oid.
        /// </summary>
        /// <param name="subOid">The sub oid.</param>
        /// <param name="varBind">The variable bind.</param>
        /// <param name="varBinds">The variable bind List.</param>
        /// <returns>Boolean value true if subOid is found else false</returns>
        public static bool SearchFirstSubOidWith(this IReadOnlyCollection <VarBind> varBinds, ObjectIdentifier subOid, out VarBind varBind)
        {
            bool isFound = false;

            varBind = default(VarBind);
            foreach (var item in varBinds)
            {
                if (item.Oid.IsSubOid(subOid))
                {
                    varBind = item;
                    isFound = true;
                    break;
                }
            }

            return(isFound);
        }
Beispiel #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpDatagram"/> class.
 /// </summary>
 /// <param name="pduType">Type of the pdu.</param>
 /// <param name="snmpVersion">The SNMP version.</param>
 /// <param name="community">The community.</param>
 /// <param name="enterprise">The enterprise.</param>
 /// <param name="agentAddress">The agent address.</param>
 /// <param name="genericV1Trap">The generic v1 trap.</param>
 /// <param name="specificTrap">The specific trap.</param>
 /// <param name="timeStamp">The time stamp.</param>
 /// <param name="varBinds">The variable binds.</param>
 public SnmpDatagram(PduType pduType, SnmpVersion snmpVersion, string community, ObjectIdentifier enterprise, IPAddress agentAddress, GenericTrap genericV1Trap, int specificTrap, uint timeStamp, VarBind[] varBinds)
 {
     Header = new SnmpHeader(snmpVersion, community);
     PduV1 = new SnmpV1PDU(pduType, enterprise, agentAddress, genericV1Trap, specificTrap, timeStamp, varBinds);
     PduV2c = default(SnmpV2cPDU);
 }
        public void Asn1NullAndNotNullEncodingTest()
        {
            var oidWithNull = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"));
            var oidWithoutNull = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"),
               1, new Asn1TagInfo(Asn1Tag.Integer));

            var packet = new SnmpDatagramV2C(
                DateTimeOffset.MinValue,
                "1.1.1.1",
                new SnmpHeader(SnmpVersion.V2C, "Community"),
                new[] { oidWithNull, oidWithoutNull },
                PduType.SNMPv2Trap,
                50000,
                SnmpErrorStatus.NoError,
                0);

            var encoded = packet.ToSnmpEncodedByteArray();
            var snmpPack = encoded.ToSnmpDatagram();

            Assert.IsNull(snmpPack.VarBinds[0].Value);
            Assert.AreEqual(1, (long)snmpPack.VarBinds[1].Value);
        }
        public void Asn1IpAdressEncodingTest()
        {
            var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"),
            new System.Net.IPAddress(123453), new Asn1TagInfo(Asn1SnmpTag.IpAddress));

            var packet = new SnmpDatagramV2C(
                DateTimeOffset.MinValue,
                "1.1.1.1",
                new SnmpHeader(SnmpVersion.V2C, "Community"),
                new[] { sysUpTime },
                PduType.SNMPv2Trap,
                50000,
                SnmpErrorStatus.NoError,
                0);

            var encoded = packet.ToSnmpEncodedByteArray();
            var snmpPack = encoded.ToSnmpDatagram();

            Assert.AreEqual("61.226.1.0", snmpPack.VarBinds[0].Value.ToString());
        }
        /// <summary>
        /// Reads the variable binds.
        /// </summary>
        /// <param name="bytes">The bytes.</param>
        /// <param name="offset">The offset.</param>
        /// <param name="bytesLength">Length of the bytes.</param>
        /// <returns>
        /// VarBinds
        /// </returns>
        /// <exception cref="System.DataMisalignedException">Bad Data/Mulformated Asn1/Snmp data</exception>
        /// <exception cref="InvalidOperationException">Malformed datagram/Out of sequemce data</exception>
        public static VarBind[] ReadVarBinds(this byte[] bytes, int offset, int bytesLength)
        {
            VarBind[] values = new VarBind[100];
            int varbindCount = 0;
            bytesLength += offset;

            while (offset < bytesLength)
            {
                Asn1TagInfo cct = bytes[offset++].DecodeToClassConstructType();
                int length;
                offset = ReadLength(bytes, offset, out length);

                if (ConstructType.Primitive != cct.Asn1ConstructType)
                {
                    continue;
                }

                if (cct.Asn1TagType == Asn1Tag.NotAsn1Data || cct.Asn1TagType != Asn1Tag.ObjectIdentifier)
                {
                    throw new DataMisalignedException("Bad Data/Mulformated Asn1/Snmp data");
                }

                uint[] key = ReadOids(bytes, offset, length);
                offset += length;

                // Get [TLV] type, length, value
                cct = bytes[offset++].DecodeToClassConstructType();
                offset = ReadLength(bytes, offset, out length);
                object value;
                offset = GetVarBindValue(bytes, offset, length, cct, out value);

                //Make varbind
                MakeVarBinds(ref values, key, value, cct, varbindCount++);
            }

            if (varbindCount != values.Length)
            {
                Array.Resize(ref values, varbindCount);
            }

            return values;
        }
        /// <summary>
        /// Makes the variable binds.
        /// </summary>
        /// <param name="varBinds">Varbind value.</param>
        /// <param name="key">The key.</param>
        /// <param name="value">The value.</param>
        /// <param name="tag">The asn1 tag.</param>
        /// <param name="varbindCount">The varbind count.</param>
        private static void MakeVarBinds(ref VarBind[] varBinds, uint[] key, object value, Asn1TagInfo tag, int varbindCount)
        {
            int length = varBinds.Length;
            if (varbindCount >= length)
            {
                Array.Resize(ref varBinds, length + 100);
            }

            varBinds[varbindCount] = new VarBind(new ObjectIdentifier(key), value, tag);
        }
Beispiel #17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpDatagram"/> class.
 /// </summary>
 /// <param name="pduType">Type of the pdu.</param>
 /// <param name="snmpVersion">The SNMP version.</param>
 /// <param name="community">The community.</param>
 /// <param name="requestId">The request identifier.</param>
 /// <param name="errorStatus">The error status.</param>
 /// <param name="errorIndex">Index of the error.</param>
 /// <param name="varBinds">The variable binds.</param>
 public SnmpDatagram(PduType pduType, SnmpVersion snmpVersion, string community, int requestId, SnmpErrorStatus errorStatus, int errorIndex, VarBind[] varBinds)
 {
     Header = new SnmpHeader(snmpVersion, community);
     PduV2c = new SnmpV2cPDU(pduType, requestId, errorStatus, errorIndex, varBinds);
     PduV1 = default(SnmpV1PDU);
 }