Пример #1
0
        private static int GetMaxRepetitions(PduType type, SnmpVersion version,
                                             int vbCount, int rowCount, int maxRows, int rowsPerQuery)
        {
            if (type != PduType.GetBulk)
            {
                return(0);
            }

            // This is a simple heuristic algorithm that allows to limit
            // the size of a GetBulk response (to fit in a MTU packet).
            if (rowsPerQuery <= 0)
            {
                int header = version == SnmpVersion.SNMPv3
                                        ? MAX_HEADER_V3_SIZE_ : MAX_HEADER_V1_SIZE_;
                rowsPerQuery = ((MAX_DATAGRAM_SIZE_ - header)
                                / vbCount) / AVG_VARBIND_SIZE_;
            }

            int toRead = maxRows - rowCount;

            if (toRead < rowsPerQuery && toRead > 0)
            {
                rowsPerQuery = toRead;
            }
            return(rowsPerQuery);
        }
Пример #2
0
        public static Vb[] CreateVbs(PduType pduType, string[] oids, int oidsCount,
                                     string[] types, int typesCount, string[] values, int valuesCount)
        {
            if (typesCount != valuesCount)
            {
                throw new ArgumentException(
                          "types and values must be specified the same number of times");
            }

            Vb[] vbs = new Vb[oidsCount];
            if (pduType != PduType.Set && typesCount == 0)
            {
                for (int i = 0; i < oidsCount; i++)
                {
                    vbs[i] = new Vb(oids[i]);
                }
            }
            else
            {
                if (oidsCount != typesCount)
                {
                    throw new ArgumentException(
                              "OBJECT IDENTIFIERs and types must be specified"
                              + " the same number of times");
                }

                for (int i = 0; i < oidsCount; i++)
                {
                    vbs[i] = Vb.Create(oids[i], types[i], values[i]);
                }
            }
            return(vbs);
        }
Пример #3
0
 /// <summary>Constructor.</summary>
 /// <remarks>
 ///     Standard constructor that sets ScopedPdu request type and request id. For valid types see <see cref="PduType" />.
 ///     By default, requestId value is set to a random value. Second argument allows caller to specify request
 ///     id for this packet
 /// </remarks>
 /// <param name="pduType">Pdu type value.</param>
 /// <param name="requestId">Request id for the ScopedPdu instance.</param>
 public ScopedPdu(PduType pduType, int requestId)
     : base(pduType)
 {
     _requestId.Value = requestId;
     _contextEngineId = new OctetString();
     _contextName = new OctetString();
 }
Пример #4
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());
 }
Пример #5
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;
 }
Пример #6
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpPDU"/> 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 SnmpPDU(PduType pduType, VarBind[] varBinds, int requestId, SnmpErrorStatus errorStatus, int errorIndex)
 {
     PduType     = pduType;
     VarBinds    = new ReadOnlyCollection <VarBind>(varBinds);
     RequestId   = requestId;
     ErrorStatus = errorStatus;
     ErrorIndex  = errorIndex;
 }
Пример #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpPDU"/> 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 SnmpPDU(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());
 }
Пример #8
0
        private Pdu CreatePDU(PduType pduType)
        {
            Pdu result = new Pdu()
            {
                Type = pduType,
            };

            return(result);
        }
Пример #9
0
 /// <summary>
 ///     Constructor.
 /// </summary>
 /// <remarks>
 ///     Create Pdu of specific type.
 /// </remarks>
 /// <param name="pduType">Pdu type. For available values see <see cref="PduType" /></param>
 public Pdu(PduType pduType)
     : this()
 {
     _asnType = (byte)pduType;
     if (_asnType == (byte)PduType.GetBulk)
     {
         _errorStatus.Value = 0;
         _errorIndex.Value  = 100;
     }
 }
Пример #10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpV1PDU"/> struct.
 /// </summary>
 /// <param name="pduType">Type of the pdu.</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 SnmpV1PDU(PduType pduType, ObjectIdentifier enterprise, IPAddress agentAddress, GenericTrap genericV1Trap, int specificTrap, uint timeStamp, VarBind[] varBinds)
 {
     PduType       = pduType;
     VarBinds      = new ReadOnlyCollection <VarBind>((VarBind[])varBinds.Clone());
     Enterprise    = enterprise;
     AgentAddress  = agentAddress;
     GenericV1Trap = genericV1Trap;
     SpecificTrap  = specificTrap;
     TimeStamp     = timeStamp;
 }
Пример #11
0
        /// <summary>
        /// Converts the Asn.1 encoded byte array to SNMP Datagram.
        /// </summary>
        /// <param name="bytes">The asn.1 encoded bytes.</param>
        /// <returns>
        /// SnmpPacket
        /// </returns>
        /// <exception cref="System.ArgumentNullException">bytes</exception>
        /// <exception cref="System.IO.InvalidDataException">Snmp Version V3 not supported</exception>
        /// <exception cref="System.NotImplementedException">SNMP v1 traps are not yet implemented</exception>
        public static SnmpDatagram ToSnmpDatagram(this byte[] bytes)
        {
            if (bytes == null || bytes.Length == 0)
            {
                throw new ArgumentNullException("bytes");
            }

            int offset = 0;
            int length;

            offset = bytes.NextValueLength(offset, -1, -1, -1, out length);
            offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
            SnmpVersion snmpVersion = (SnmpVersion)bytes.ReadInteger(offset, length);

            offset += length;

            if (snmpVersion == SnmpVersion.V3)
            {
                throw new InvalidDataException("Snmp Version V3 not supported");
            }

            offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.OctetString, out length);
            string community = bytes.ReadOctetString(offset, length);

            offset += length;

            PduType pduType = (PduType)(bytes[offset++] & 0x1F);

            if (pduType == PduType.Trap)
            {
                throw new NotImplementedException("SNMP v1 traps are not yet implemented");
            }

            offset = bytes.ReadLength(offset, out length);

            offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
            int requestId = bytes.ReadInteger(offset, length);

            offset += length;

            offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
            SnmpErrorStatus errorStatus = (SnmpErrorStatus)bytes.ReadInteger(offset, length);

            offset += length;

            offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
            int errorIndex = bytes.ReadInteger(offset, length);

            offset += length;

            offset = bytes.NextValueLength(offset, (int)Asn1Class.Universal, (int)ConstructType.Constructed, (int)Asn1Tag.Sequence, out length);
            VarBind[] varBinds = bytes.ReadVarBinds(offset, length);

            return(new SnmpDatagram(new SnmpHeader(snmpVersion, community), new SnmpPDU(pduType, varBinds, requestId, errorStatus, errorIndex)));
        }
Пример #12
0
        private Pdu CreatePDU(PduType pduType)
        {
            Pdu result = new Pdu()
            {
                Type = pduType,
            };

            result.VbList.Add(new Oid("1.3.6.1.4.1.368.4.1.3.1.4.1.4"));

            return(result);
        }
Пример #13
0
        /// <summary>
        /// 把OidList打包成PDU
        /// </summary>
        /// <param name="oidList"></param>
        /// <returns></returns>
        private Pdu PacketPdu(PduType pduType, IEnumerable <Vb> vbs)
        {
            var pdu = new Pdu(pduType);

            foreach (Vb vb in vbs)
            {
                pdu.VbList.Add(vb);
            }

            return(pdu);
        }
Пример #14
0
        /// <summary>
        /// Creates the PDU. Supported protocol versions are IEEE 1278.1-1995 and IEEE 1278.1A-1998.
        /// </summary>
        /// <param name="type">The type of PDU to be created.</param>
        /// <param name="version">The version of the PDU to be created</param>
        /// <returns>
        /// Returns the corresponding PDU instance or null if PduType.Other is specified.
        /// </returns>
        /// <exception cref="NotSupportedException">if the PDU type specified in parameter is not supported.</exception>
        /// <exception cref="ArgumentException">if the protocol version is not supported</exception>
        public static IPdu CreatePdu(PduType type, ProtocolVersion version)
        {
            if (version == ProtocolVersion.Ieee1278_1_1995)
            {
                return(Dis1995.PduFactory.CreatePdu(type));
            }
            else if (version == ProtocolVersion.Ieee1278_1A_1998)
            {
                return(Dis1998.PduFactory.CreatePdu(type));
            }

            throw new ArgumentException("Unsupported protocol version.");
        }
Пример #15
0
 public SnmpDatagramV2C(
     DateTimeOffset receivedTime,
     string sourceIpAddress,
     SnmpHeader header,
     IReadOnlyList <VarBind> varBinds,
     PduType pduType,
     int requestId,
     SnmpErrorStatus errorStatus,
     int errorIndex)
     : base(receivedTime, sourceIpAddress, header, varBinds)
 {
     this.PduType     = pduType;
     this.RequestId   = requestId;
     this.ErrorStatus = errorStatus;
     this.ErrorIndex  = errorIndex;
 }
Пример #16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpSimpleDatagram" /> class.
 /// </summary>
 /// <param name="snmpDatagramInput">The SNMP datagram input.</param>
 public SnmpSimpleDatagram(SnmpDatagram snmpDatagramInput)
 {
     snmpDatagram = snmpDatagramInput;
     Version      = snmpDatagram.Header.Version;
     Community    = snmpDatagram.Header.Community;
     PDUType      = snmpDatagram.PduV2c.PduType;
     RequestId    = snmpDatagram.PduV2c.RequestId;
     ErrorStatus  = snmpDatagram.PduV2c.ErrorStatus;
     ErrorIndex   = snmpDatagram.PduV2c.ErrorIndex;
     VarBinds     = new List <KeyValuePair <string, object> >();
     for (int i = 0; i < snmpDatagram.PduV2c.VarBinds.Count; i++)
     {
         var varBind = snmpDatagram.PduV2c.VarBinds[i];
         VarBinds.Add(new KeyValuePair <string, object>(varBind.Oid.ToString(), varBind.Value));
     }
 }
Пример #17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SnmpSimpleDatagram" /> class.
 /// </summary>
 /// <param name="snmpDatagramInput">The SNMP datagram input.</param>
 public SnmpSimpleDatagram(SnmpDatagram snmpDatagramInput)
 {
     snmpDatagram = snmpDatagramInput;
     Version = snmpDatagram.Header.Version;
     Community = snmpDatagram.Header.Community;
     PDUType = snmpDatagram.PduV2c.PduType;
     RequestId = snmpDatagram.PduV2c.RequestId;
     ErrorStatus = snmpDatagram.PduV2c.ErrorStatus;
     ErrorIndex = snmpDatagram.PduV2c.ErrorIndex;
     VarBinds = new List<KeyValuePair<string, object>>();
     for(int i=0 ; i< snmpDatagram.PduV2c.VarBinds.Count; i++)
     {
         var varBind = snmpDatagram.PduV2c.VarBinds[i];
         VarBinds.Add(new KeyValuePair<string, object>(varBind.Oid.ToString(), varBind.Value));
     }
 }
Пример #18
0
        /// <summary>
        /// SNMP Operation Execute
        /// </summary>
        /// <example>Set operation in SNMP version 1:
        /// <code>
        /// </code>
        ///
        ///
        /// </example>
        /// <param name="version">SNMPAgentInfo. 对端SNMP Agent相关配置信息</param>
        /// <param name="pdu">PduType. 要执行的操作类型:Get/Set/GetNext/GetBulk</param>
        /// <param name="pdu">Vb[]. 操作参数</param>
        /// <returns>Result of the SNMP request in a IEnumerator<vb> </returns>
        public IEnumerable <Vb> Excute(SnmpAgentInfo peer, PduType pduType, IEnumerable <Vb> vbs)
        {
            //验证对端地址信息是否正确
            if (!this.ValidPeer(peer))
            {
                Log.Error("SnmpAgentInfo校验失败!");
                return(null);
            }

            //组装PDU
            Pdu pdu = this.PacketPdu(pduType, vbs);

            //GetBulk包需要设置NonRepeaters和MaxRepetitions两个字段
            if (PduType.GetBulk == pdu.Type)
            {
                pdu.NonRepeaters   = peer.NonRepeaters;
                pdu.MaxRepetitions = peer.MaxRepetitions;
            }

            using (var _target = new UdpTarget(peer.PeerAddress, peer.Port, peer.TimeOut, peer.RetryTime))
            {
                SnmpPacket result = null;
                try
                {
                    var param = new AgentParameters(peer.Version, new OctetString(peer.Community));
                    result = _target.Request(pdu, param);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.Message);
                    throw;
                }

                if (result != null)
                {
                    if (result.Pdu.ErrorStatus == 0)
                    {
                        return(result.Pdu);
                    }

                    throw new SnmpErrorStatusException("Agent responded with an error", result.Pdu.ErrorStatus, result.Pdu.ErrorIndex);
                }
            }

            return(null);
        }
Пример #19
0
        private void comboBoxGetStyle_SelectedIndexChanged(object sender, EventArgs e)
        {
            PduType pduType = (PduType)((DictionaryEntry)comboBoxGetStyle.SelectedItem).Value;

            if (pduType == PduType.GetBulk && snmpObj.Version == SnmpVersion.Ver1)
            {
                MessageBox.Show("Ver1不支持Bulk...", "提示");
                comboBoxGetStyle.SelectedIndex = 0;
                pduType = (PduType)((DictionaryEntry)comboBoxGetStyle.SelectedItem).Value;
            }
            else if (pduType == PduType.Set && snmpObj.Version == SnmpVersion.Ver3)
            {
                MessageBox.Show("后续版本增加Ver3版本SET支持...", "提示");
                comboBoxGetStyle.SelectedIndex = 0;
                pduType = (PduType)((DictionaryEntry)comboBoxGetStyle.SelectedItem).Value;
            }
            snmpObj.PduType         = pduType;
            comboBoxAsnType.Visible = snmpObj.PduType == PduType.Set;
            tAsnType.Visible        = snmpObj.PduType == PduType.Set;
        }
Пример #20
0
        private static void GetOperType(string op,
                                        out PduType pduType, out OperType operType)
        {
            operType = OperType.Simple;
            switch (op)
            {
            case "walk":
                pduType  = PduType.GetNext;
                operType = OperType.Walk;
                break;

            case "table":
                pduType  = PduType.GetBulk;
                operType = OperType.Table;
                break;

            default:
                pduType = (PduType)Enum.Parse(typeof(PduType), op, true);
                break;
            }
        }
Пример #21
0
            public TPDU(TPKT tPKT)
            {
                TPkt = tPKT;

                HeaderLength = tPKT.Data[0]; // Header length excluding this length byte
                if (HeaderLength >= 2)
                {
                    PDUType = (PduType)tPKT.Data[1];
                    if (PDUType == PduType.Data) //DT Data
                    {
                        var flags = tPKT.Data[2];
                        TPDUNumber   = flags & 0x7F;
                        LastDataUnit = (flags & 0x80) > 0;
                        Data         = new byte[tPKT.Data.Length - HeaderLength - 1]; // substract header length byte + header length.
                        Array.Copy(tPKT.Data, HeaderLength + 1, Data, 0, Data.Length);
                        return;
                    }
                    //TODO: Handle other PDUTypes
                }
                Data = new byte[0];
            }
Пример #22
0
        /// <summary>
        /// Creates the PDU.
        /// </summary>
        /// <param name="type">The type of PDU to be created.</param>
        /// <returns>Returns the corresponding PDU instance or null if PduType.Other is specified.</returns>
        /// <exception cref="NotSupportedException">if the PDU type specified in parameter is not supported.</exception>
        public static IPdu CreatePdu(PduType type)
        {
            IPdu pdu = type switch
            {
                PduType.Other => new Pdu(),
                PduType.EntityState => new EntityStatePdu(),
                PduType.Fire => new FirePdu(),
                PduType.Detonation => new DetonationPdu(),
                PduType.Collision => new CollisionPdu(),
                PduType.ServiceRequest => new ServiceRequestPdu(),
                PduType.ResupplyOffer => new ResupplyOfferPdu(),
                PduType.ResupplyReceived => new ResupplyReceivedPdu(),
                PduType.ResupplyCancel => new ResupplyCancelPdu(),
                PduType.RepairComplete => new RepairCompletePdu(),
                PduType.RepairResponse => new RepairResponsePdu(),
                PduType.CreateEntity => new CreateEntityPdu(),
                PduType.RemoveEntity => new RemoveEntityPdu(),
                PduType.StartResume => new StartResumePdu(),
                PduType.StopFreeze => new StopFreezePdu(),
                PduType.Acknowledge => new AcknowledgePdu(),
                PduType.ActionRequest => new ActionRequestPdu(),
                PduType.ActionResponse => new ActionResponsePdu(),
                PduType.DataQuery => new DataQueryPdu(),
                PduType.SetData => new SetDataPdu(),
                PduType.Data => new DataPdu(),
                PduType.EventReport => new EventReportPdu(),
                PduType.Comment => new CommentPdu(),
                PduType.ElectromagneticEmission => throw new NotSupportedException(),
                      PduType.Designator => new DesignatorPdu(),
                      PduType.Transmitter => new TransmitterPdu(),
                      PduType.Signal => new SignalPdu(),
                      PduType.Receiver => new ReceiverPdu(),
                      _ => throw new NotSupportedException(),
            };

            return(pdu);
        }
Пример #23
0
 public SnmpDatagramV2C(
     DateTimeOffset receivedTime,
     string sourceIpAddress,
     SnmpHeader header,
     IReadOnlyList<VarBind> varBinds,
     PduType pduType,
     int requestId,
     SnmpErrorStatus errorStatus,
     int errorIndex)
     : base(receivedTime, sourceIpAddress, header, varBinds)
 {
     this.PduType = pduType;
     this.RequestId = requestId;
     this.ErrorStatus = errorStatus;
     this.ErrorIndex = errorIndex;
 }
Пример #24
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);
 }
Пример #25
0
 /// <summary>
 ///     Constructor.
 /// </summary>
 /// <param name="pduType">Pdu type value. For available types see <see cref="PduType" />.</param>
 public ScopedPdu(PduType pduType)
     : base(pduType)
 {
     _contextEngineId = new OctetString();
     _contextName = new OctetString();
 }
Пример #26
0
 /// <summary>
 /// Used to unmarshal data back into the correct PDU type.
 /// </summary>
 /// <param name="pduType">PDU type</param>
 /// <param name="rawPDU">byte array containing the raw packets</param>
 /// <param name="endian">Endian type</param>
 /// <remarks>Added by PES to work with Mobile.</remarks>
 /// <returns>The PDU instance.</returns>
 public static Pdu UnmarshalRawPdu(PduType pduType, byte[] rawPdu, Endian endian)
 {
     DataInputStream ds = new DataInputStream(rawPdu, endian);
     return UnmarshalRawPdu(pduType, ds);
 }
Пример #27
0
        /// <summary>
        /// Used to unmarshal data back into the correct PDU type.
        /// </summary>
        /// <param name="pduType">PDU type</param>
        /// <param name="ds">Datastream which contains the raw packet and Endian Type</param>
        /// <remarks>Added by PES to work with Mobile.</remarks>
        /// <returns>The PDU instance.</returns>
        public static Pdu UnmarshalRawPdu(PduType pduType, DataInputStream ds)
        {
            Pdu pdu = new Pdu();

            switch (pduType)
            {
                case PduType.EntityState:
                    EntityStatePdu entityStatePdu = new EntityStatePdu();
                    entityStatePdu.Unmarshal(ds);
                    pdu = (Pdu)entityStatePdu;
                    break;
                case PduType.Fire:
                    FirePdu firePdu = new FirePdu();
                    firePdu.Unmarshal(ds);
                    pdu = (Pdu)firePdu;
                    break;
                case PduType.Detonation:
                    DetonationPdu detonationPdu = new DetonationPdu();
                    detonationPdu.Unmarshal(ds);
                    pdu = (Pdu)detonationPdu;
                    break;
                case PduType.Collision:
                    CollisionPdu collisionPdu = new CollisionPdu();
                    collisionPdu.Unmarshal(ds);
                    pdu = (Pdu)collisionPdu;
                    break;
                case PduType.ServiceRequest:
                    ServiceRequestPdu serviceRequestPdu = new ServiceRequestPdu();
                    serviceRequestPdu.Unmarshal(ds);
                    pdu = (Pdu)serviceRequestPdu;
                    break;
                case PduType.ResupplyOffer:
                    ResupplyOfferPdu resupplyOfferPdu = new ResupplyOfferPdu();
                    resupplyOfferPdu.Unmarshal(ds);
                    pdu = (Pdu)resupplyOfferPdu;
                    break;
                case PduType.ResupplyReceived:
                    ResupplyReceivedPdu resupplyReceivedPdu = new ResupplyReceivedPdu();
                    resupplyReceivedPdu.Unmarshal(ds);
                    pdu = (Pdu)resupplyReceivedPdu;
                    break;
                case PduType.ResupplyCancel:
                    ResupplyCancelPdu resupplyCancelPdu = new ResupplyCancelPdu();
                    resupplyCancelPdu.Unmarshal(ds);
                    pdu = (Pdu)resupplyCancelPdu;
                    break;
                case PduType.RepairComplete:
                    RepairCompletePdu repairCompletePdu = new RepairCompletePdu();
                    repairCompletePdu.Unmarshal(ds);
                    pdu = (Pdu)repairCompletePdu;
                    break;
                case PduType.RepairResponse:
                    RepairResponsePdu repairResponsePdu = new RepairResponsePdu();
                    repairResponsePdu.Unmarshal(ds);
                    pdu = (Pdu)repairResponsePdu;
                    break;
                case PduType.CreateEntity:
                    CreateEntityPdu createEntityPdu = new CreateEntityPdu();
                    createEntityPdu.Unmarshal(ds);
                    pdu = (Pdu)createEntityPdu;
                    break;
                case PduType.RemoveEntity:
                    RemoveEntityPdu removeEntityPdu = new RemoveEntityPdu();
                    removeEntityPdu.Unmarshal(ds);
                    pdu = (Pdu)removeEntityPdu;
                    break;
                case PduType.StartResume:
                    StartResumePdu startResumePdu = new StartResumePdu();
                    startResumePdu.Unmarshal(ds);
                    pdu = (Pdu)startResumePdu;
                    break;
                case PduType.Acknowledge:
                    AcknowledgePdu acknowledgePdu = new AcknowledgePdu();
                    acknowledgePdu.Unmarshal(ds);
                    pdu = (Pdu)acknowledgePdu;
                    break;
                case PduType.ActionRequest:
                    ActionRequestPdu actionRequestPdu = new ActionRequestPdu();
                    actionRequestPdu.Unmarshal(ds);
                    pdu = (Pdu)actionRequestPdu;
                    break;
                case PduType.ActionResponse:
                    ActionResponsePdu actionResponsePdu = new ActionResponsePdu();
                    actionResponsePdu.Unmarshal(ds);
                    pdu = (Pdu)actionResponsePdu;
                    break;
                case PduType.DataQuery:
                    DataQueryPdu dataQueryPdu = new DataQueryPdu();
                    dataQueryPdu.Unmarshal(ds);
                    pdu = (Pdu)dataQueryPdu;
                    break;
                case PduType.SetData:
                    SetDataPdu setDataPdu = new SetDataPdu();
                    setDataPdu.Unmarshal(ds);
                    pdu = (Pdu)setDataPdu;
                    break;
                case PduType.EventReport:
                    EventReportPdu eventReportPdu = new EventReportPdu();
                    eventReportPdu.Unmarshal(ds);
                    pdu = (Pdu)eventReportPdu;
                    break;
                case PduType.Comment:
                    CommentPdu commentPdu = new CommentPdu();
                    commentPdu.Unmarshal(ds);
                    pdu = (Pdu)commentPdu;
                    break;
                case PduType.StopFreeze:
                    StopFreezePdu stopFreezePdu = new StopFreezePdu();
                    stopFreezePdu.Unmarshal(ds);
                    pdu = (Pdu)stopFreezePdu;
                    break;
                case PduType.Signal:
                    SignalPdu signalPdu = new SignalPdu();
                    signalPdu.Unmarshal(ds);
                    pdu = (Pdu)signalPdu;
                    break;
                case PduType.Transmitter:
                    TransmitterPdu transmitterPdu = new TransmitterPdu();
                    transmitterPdu.Unmarshal(ds);
                    pdu = (Pdu)transmitterPdu;
                    break;
            }

            return pdu;
        }
Пример #28
0
        /// <summary>
        /// Used to unmarshal data back into the correct PDU type.
        /// </summary>
        /// <param name="pduType">PDU type</param>
        /// <param name="rawPdu">byte array containing the raw packets</param>
        /// <param name="endian">Endian type</param>
        /// <remarks>Added by PES to work with Mobile.</remarks>
        /// <returns>The PDU instance.</returns>
        public static Pdu UnmarshalRawPdu(PduType pduType, byte[] rawPdu, Endian endian)
        {
            var ds = new DataInputStream(rawPdu, endian);

            return(UnmarshalRawPdu(pduType, ds));
        }
Пример #29
0
        /// <summary>
        /// Creates the PDU.
        /// </summary>
        /// <param name="type">The type of PDU to be created.</param>
        /// <returns>Returns the corresponding PDU instance or null if PduType.Other is specified.</returns>
        /// <exception cref="NotImplementedException">if the PDU type specified in parameter is not supported.</exception>
        public static IPdu CreatePdu(PduType type)
        {
            IPdu pdu = null;

            switch (type)
            {
                case PduType.Other:
                    pdu = new Pdu();
                    break;
                case PduType.EntityState:
                    pdu = new EntityStatePdu();
                    break;
                case PduType.Fire:
                    pdu = new FirePdu();
                    break;
                case PduType.Detonation:
                    pdu = new DetonationPdu();
                    break;
                case PduType.Collision:
                    pdu = new CollisionPdu();
                    break;
                case PduType.ServiceRequest:
                    pdu = new ServiceRequestPdu();
                    break;
                case PduType.ResupplyOffer:
                    pdu = new ResupplyOfferPdu();
                    break;
                case PduType.ResupplyReceived:
                    pdu = new ResupplyReceivedPdu();
                    break;
                case PduType.ResupplyCancel:
                    pdu = new ResupplyCancelPdu();
                    break;
                case PduType.RepairComplete:
                    pdu = new RepairCompletePdu();
                    break;
                case PduType.RepairResponse:
                    pdu = new RepairResponsePdu();
                    break;
                case PduType.CreateEntity:
                    pdu = new CreateEntityPdu();
                    break;
                case PduType.RemoveEntity:
                    pdu = new RemoveEntityPdu();
                    break;
                case PduType.StartResume:
                    pdu = new StartResumePdu();
                    break;
                case PduType.StopFreeze:
                    pdu = new StopFreezePdu();
                    break;
                case PduType.Acknowledge:
                    pdu = new AcknowledgePdu();
                    break;
                case PduType.ActionRequest:
                    pdu = new ActionRequestPdu();
                    break;
                case PduType.ActionResponse:
                    pdu = new ActionResponsePdu();
                    break;
                case PduType.DataQuery:
                    pdu = new DataQueryPdu();
                    break;
                case PduType.SetData:
                    pdu = new SetDataPdu();
                    break;
                case PduType.Data:
                    pdu = new DataPdu();
                    break;
                case PduType.EventReport:
                    pdu = new EventReportPdu();
                    break;
                case PduType.Comment:
                    pdu = new CommentPdu();
                    break;
                case PduType.ElectromagneticEmission:
                    throw new NotImplementedException();
                case PduType.Designator:
                    pdu = new DesignatorPdu();
                    break;
                case PduType.Transmitter:
                    pdu = new TransmitterPdu();
                    break;
                case PduType.Signal:
                    pdu = new SignalPdu();
                    break;
                case PduType.Receiver:
                    pdu = new ReceiverPdu();
                    break;
                default:
                    throw new NotImplementedException();
            }

            return pdu;
        }
Пример #30
0
        /// <summary>
        /// Used to unmarshal data back into the correct PDU type.
        /// </summary>
        /// <param name="pduType">PDU type</param>
        /// <param name="ds">Datastream which contains the raw packet and Endian Type</param>
        /// <remarks>Added by PES to work with Mobile.</remarks>
        /// <returns>The PDU instance.</returns>
        public static Pdu UnmarshalRawPdu(PduType pduType, DataInputStream ds)
        {
            var pdu = new Pdu();

            switch (pduType)
            {
            case PduType.EntityState:
                pdu = new EntityStatePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Fire:
                pdu = new FirePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Detonation:
                pdu = new DetonationPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Collision:
                pdu = new CollisionPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ServiceRequest:
                pdu = new ServiceRequestPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ResupplyOffer:
                pdu = new ResupplyOfferPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ResupplyReceived:
                pdu = new ResupplyReceivedPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ResupplyCancel:
                pdu = new ResupplyCancelPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RepairComplete:
                pdu = new RepairCompletePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RepairResponse:
                pdu = new RepairResponsePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.CreateEntity:
                pdu = new CreateEntityPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RemoveEntity:
                pdu = new RemoveEntityPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.StartResume:
                pdu = new StartResumePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Acknowledge:
                pdu = new AcknowledgePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ActionRequest:
                pdu = new ActionRequestPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ActionResponse:
                pdu = new ActionResponsePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.DataQuery:
                pdu = new DataQueryPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.SetData:
                pdu = new SetDataPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.EventReport:
                pdu = new EventReportPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Comment:
                pdu = new CommentPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.StopFreeze:
                pdu = new StopFreezePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Signal:
                pdu = new SignalPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Transmitter:
                pdu = new TransmitterPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ElectromagneticEmission:
                pdu = new ElectronicEmissionsPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Designator:
                pdu = new DesignatorPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Receiver:
                pdu = new ReceiverPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.IFF_ATC_NAVAIDS:
                pdu = new IffAtcNavAidsLayer1Pdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.UnderwaterAcoustic:
                pdu = new UaPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.SupplementalEmissionEntityState:
                pdu = new SeesPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.IntercomSignal:
                pdu = new IntercomSignalPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.IntercomControl:
                pdu = new IntercomControlPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.AggregateState:
                pdu = new AggregateStatePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.IsGroupOf:
                pdu = new IsGroupOfPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.TransferControl:
                pdu = new TransferControlRequestPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.IsPartOf:
                pdu = new IsPartOfPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.MinefieldState:
                pdu = new MinefieldStatePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.MinefieldQuery:
                pdu = new MinefieldQueryPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.MinefieldData:
                pdu = new MinefieldDataPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.MinefieldResponseNAK:
                pdu = new MinefieldResponseNackPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.EnvironmentalProcess:
                pdu = new EnvironmentalProcessPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.GriddedData:
                pdu = new GriddedDataPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.PointObjectState:
                pdu = new PointObjectStatePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.LinearObjectState:
                pdu = new LinearObjectStatePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ArealObjectState:
                pdu = new ArealObjectStatePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.TSPI:
                throw new NotSupportedException();

            case PduType.Appearance:
                throw new NotSupportedException();

            case PduType.ArticulatedParts:
                throw new NotSupportedException();

            case PduType.LEFire:
                throw new NotSupportedException();

            case PduType.LEDetonation:
                throw new NotSupportedException();

            case PduType.CreateEntityR:
                pdu = new CreateEntityReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RemoveEntityR:
                pdu = new RemoveEntityReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.StartResumeR:
                pdu = new StartResumeReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.StopFreezeR:
                pdu = new StopFreezeReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.AcknowledgeR:
                pdu = new AcknowledgeReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ActionRequestR:
                pdu = new ActionRequestReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ActionResponseR:
                pdu = new ActionResponseReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.DataQueryR:
                pdu = new DataQueryReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.SetDataR:
                pdu = new SetDataReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.DataR:
                pdu = new DataReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.EventReportR:
                pdu = new EventReportReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.CommentR:
                pdu = new CommentReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RecordR:
                pdu = new RecordQueryReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.SetRecordR:
                pdu = new SetRecordReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RecordQueryR:
                pdu = new RecordQueryReliablePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.CollisionElastic:
                pdu = new CollisionElasticPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.EntityStateUpdate:
                pdu = new EntityStateUpdatePdu();
                pdu.Unmarshal(ds);
                break;
            }

            return(pdu);
        }
Пример #31
0
        /// <summary>
        /// Converts the Asn.1 encoded byte array to SNMP Datagram.
        /// </summary>
        /// <param name="byteSegment">The asn.1 encoded bytes.</param>
        /// <param name="timestamp">The timestamp when the packet has been received.</param>
        /// <param name="sourceIpAddress">The source IP address of the packet.</param>
        /// <returns>
        /// SnmpPacket
        /// </returns>
        /// <exception cref="System.ArgumentNullException">bytes</exception>
        /// <exception cref="System.IO.InvalidDataException">Snmp Version V3 not supported</exception>
        public static SnmpDatagram ToSnmpDatagram(
            this ArraySegment <byte> byteSegment,
            DateTimeOffset timestamp,
            string sourceIpAddress)
        {
            var bytes = byteSegment.Array;

            if (bytes == null || bytes.Length == 0)
            {
                throw new ArgumentNullException("byteSegment");
            }

            int offset = byteSegment.Offset;
            int length;

            offset = bytes.NextValueLength(offset, -1, -1, -1, out length);
            offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
            SnmpVersion snmpVersion = (SnmpVersion)bytes.ReadInteger(offset, length);

            offset += length;

            if (snmpVersion == SnmpVersion.V3)
            {
                throw new InvalidDataException("Snmp Version V3 not supported");
            }

            offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.OctetString, out length);
            string community = bytes.ReadOctetString(offset, length);

            offset += length;

            PduType pduType = (PduType)(bytes[offset++] & 0x1F);

            offset = bytes.ReadLength(offset, out length);
            if (snmpVersion == SnmpVersion.V1 && pduType == PduType.Trap)
            {
                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.ObjectIdentifier, out length);
                ObjectIdentifier oid = new ObjectIdentifier(bytes.ReadOids(offset, length));
                offset += length;

                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1SnmpTag.IpAddress, out length);
                IPAddress ipAddress = bytes.ReadIpAddress(offset);
                offset += length;

                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
                GenericTrap genericTrap = (GenericTrap)bytes.ReadInteger(offset, length);
                offset += length;

                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
                int specificTrap = bytes.ReadInteger(offset, length);
                offset += length;

                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1SnmpTag.TimeTicks, out length);
                uint timeStamp = bytes.ReadUnsignedInteger(offset, length);
                offset += length;

                offset = bytes.NextValueLength(offset, (int)Asn1Class.Universal, (int)ConstructType.Constructed, (int)Asn1Tag.Sequence, out length);
                VarBind[] varBinds = bytes.ReadVarBinds(offset, length);

                return(new SnmpDatagramV1(
                           timestamp,
                           sourceIpAddress,
                           new SnmpHeader(snmpVersion, community),
                           varBinds));
            }
            else
            {
                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
                int requestId = bytes.ReadInteger(offset, length);
                offset += length;

                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
                SnmpErrorStatus errorStatus = (SnmpErrorStatus)bytes.ReadInteger(offset, length);
                offset += length;

                offset = bytes.NextValueLength(offset, -1, -1, (int)Asn1Tag.Integer, out length);
                int errorIndex = bytes.ReadInteger(offset, length);
                offset += length;

                offset = bytes.NextValueLength(offset, (int)Asn1Class.Universal, (int)ConstructType.Constructed, (int)Asn1Tag.Sequence, out length);
                VarBind[] varBinds = bytes.ReadVarBinds(offset, length);

                return(new SnmpDatagramV2C(
                           timestamp,
                           sourceIpAddress,
                           new SnmpHeader(snmpVersion, community),
                           varBinds,
                           pduType,
                           requestId,
                           errorStatus,
                           errorIndex));
            }
        }
Пример #32
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="pduType">Pdu type value. For available types see <see cref="PduType"/>.</param>
 public ScopedPdu(PduType pduType)
     : base(pduType)
 {
     _contextEngineId = new OctetString();
     _contextName = new OctetString();
 }
Пример #33
0
 public Entity(SnmpVersion version, PduType pduType)
 {
     this.Version = version;
     this.PduType = pduType;
 }
Пример #34
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);
 }
Пример #35
0
 public Entity(string ip, SnmpVersion version, string communityName, int port, PduType pduType, string oid)
 {
     this.IP            = ip;
     this.Version       = version;
     this.CommunityName = communityName;
     this.Port          = port;
     this.PduType       = pduType;
     this.OID           = new Oid(oid);
 }
Пример #36
0
 /// <summary>Constructor.</summary>
 /// <remarks>
 /// Standard constructor that sets ScopedPdu request type and request id. For valid types see <see cref="PduType"/>.
 /// 
 /// By default, requestId value is set to a random value. Second argument allows caller to specify request
 /// id for this packet
 /// </remarks>
 /// <param name="pduType">Pdu type value.</param>
 /// <param name="requestId">Request id for the ScopedPdu instance.</param>
 public ScopedPdu(PduType pduType, int requestId)
     : base(pduType)
 {
     _requestId.Value = requestId;
     _contextEngineId = new OctetString();
     _contextName = new OctetString();
 }
Пример #37
0
        /// <summary>
        /// Used to unmarshal data back into the correct PDU type.
        /// </summary>
        /// <param name="pduType">PDU type</param>
        /// <param name="ds">Datastream which contains the raw packet and Endian Type</param>
        /// <remarks>Added by PES to work with Mobile.</remarks>
        /// <returns>The PDU instance.</returns>
        public static Pdu UnmarshalRawPdu(PduType pduType, DataInputStream ds)
        {
            Pdu pdu = new Pdu();

            switch (pduType)
            {
            case PduType.EntityState:
                EntityStatePdu entityStatePdu = new EntityStatePdu();
                entityStatePdu.Unmarshal(ds);
                pdu = (Pdu)entityStatePdu;
                break;

            case PduType.Fire:
                FirePdu firePdu = new FirePdu();
                firePdu.Unmarshal(ds);
                pdu = (Pdu)firePdu;
                break;

            case PduType.Detonation:
                DetonationPdu detonationPdu = new DetonationPdu();
                detonationPdu.Unmarshal(ds);
                pdu = (Pdu)detonationPdu;
                break;

            case PduType.Collision:
                CollisionPdu collisionPdu = new CollisionPdu();
                collisionPdu.Unmarshal(ds);
                pdu = (Pdu)collisionPdu;
                break;

            case PduType.ServiceRequest:
                ServiceRequestPdu serviceRequestPdu = new ServiceRequestPdu();
                serviceRequestPdu.Unmarshal(ds);
                pdu = (Pdu)serviceRequestPdu;
                break;

            case PduType.ResupplyOffer:
                ResupplyOfferPdu resupplyOfferPdu = new ResupplyOfferPdu();
                resupplyOfferPdu.Unmarshal(ds);
                pdu = (Pdu)resupplyOfferPdu;
                break;

            case PduType.ResupplyReceived:
                ResupplyReceivedPdu resupplyReceivedPdu = new ResupplyReceivedPdu();
                resupplyReceivedPdu.Unmarshal(ds);
                pdu = (Pdu)resupplyReceivedPdu;
                break;

            case PduType.ResupplyCancel:
                ResupplyCancelPdu resupplyCancelPdu = new ResupplyCancelPdu();
                resupplyCancelPdu.Unmarshal(ds);
                pdu = (Pdu)resupplyCancelPdu;
                break;

            case PduType.RepairComplete:
                RepairCompletePdu repairCompletePdu = new RepairCompletePdu();
                repairCompletePdu.Unmarshal(ds);
                pdu = (Pdu)repairCompletePdu;
                break;

            case PduType.RepairResponse:
                RepairResponsePdu repairResponsePdu = new RepairResponsePdu();
                repairResponsePdu.Unmarshal(ds);
                pdu = (Pdu)repairResponsePdu;
                break;

            case PduType.CreateEntity:
                CreateEntityPdu createEntityPdu = new CreateEntityPdu();
                createEntityPdu.Unmarshal(ds);
                pdu = (Pdu)createEntityPdu;
                break;

            case PduType.RemoveEntity:
                RemoveEntityPdu removeEntityPdu = new RemoveEntityPdu();
                removeEntityPdu.Unmarshal(ds);
                pdu = (Pdu)removeEntityPdu;
                break;

            case PduType.StartResume:
                StartResumePdu startResumePdu = new StartResumePdu();
                startResumePdu.Unmarshal(ds);
                pdu = (Pdu)startResumePdu;
                break;

            case PduType.Acknowledge:
                AcknowledgePdu acknowledgePdu = new AcknowledgePdu();
                acknowledgePdu.Unmarshal(ds);
                pdu = (Pdu)acknowledgePdu;
                break;

            case PduType.ActionRequest:
                ActionRequestPdu actionRequestPdu = new ActionRequestPdu();
                actionRequestPdu.Unmarshal(ds);
                pdu = (Pdu)actionRequestPdu;
                break;

            case PduType.ActionResponse:
                ActionResponsePdu actionResponsePdu = new ActionResponsePdu();
                actionResponsePdu.Unmarshal(ds);
                pdu = (Pdu)actionResponsePdu;
                break;

            case PduType.DataQuery:
                DataQueryPdu dataQueryPdu = new DataQueryPdu();
                dataQueryPdu.Unmarshal(ds);
                pdu = (Pdu)dataQueryPdu;
                break;

            case PduType.SetData:
                SetDataPdu setDataPdu = new SetDataPdu();
                setDataPdu.Unmarshal(ds);
                pdu = (Pdu)setDataPdu;
                break;

            case PduType.EventReport:
                EventReportPdu eventReportPdu = new EventReportPdu();
                eventReportPdu.Unmarshal(ds);
                pdu = (Pdu)eventReportPdu;
                break;

            case PduType.Comment:
                CommentPdu commentPdu = new CommentPdu();
                commentPdu.Unmarshal(ds);
                pdu = (Pdu)commentPdu;
                break;

            case PduType.StopFreeze:
                StopFreezePdu stopFreezePdu = new StopFreezePdu();
                stopFreezePdu.Unmarshal(ds);
                pdu = (Pdu)stopFreezePdu;
                break;

            case PduType.Signal:
                SignalPdu signalPdu = new SignalPdu();
                signalPdu.Unmarshal(ds);
                pdu = (Pdu)signalPdu;
                break;

            case PduType.Transmitter:
                TransmitterPdu transmitterPdu = new TransmitterPdu();
                transmitterPdu.Unmarshal(ds);
                pdu = (Pdu)transmitterPdu;
                break;
            }

            return(pdu);
        }
Пример #38
0
 /// <summary>
 /// Creates the PDU.
 /// </summary>
 /// <param name="type">The type of PDU to be created.</param>
 /// <returns>Returns the corresponding PDU instance or null if PduType.Other is specified.</returns>
 /// <exception cref="NotSupportedException">if the PDU type specified in parameter is not supported.</exception>
 public static IPdu CreatePdu(PduType type)
 {
     return(type switch
     {
         PduType.Other => new Pdu(),
         PduType.EntityState => new EntityStatePdu(),
         PduType.Fire => new FirePdu(),
         PduType.Detonation => new DetonationPdu(),
         PduType.Collision => new CollisionPdu(),
         PduType.ServiceRequest => new ServiceRequestPdu(),
         PduType.ResupplyOffer => new ResupplyOfferPdu(),
         PduType.ResupplyReceived => new ResupplyReceivedPdu(),
         PduType.ResupplyCancel => new ResupplyCancelPdu(),
         PduType.RepairComplete => new RepairCompletePdu(),
         PduType.RepairResponse => new RepairResponsePdu(),
         PduType.CreateEntity => new CreateEntityPdu(),
         PduType.RemoveEntity => new RemoveEntityPdu(),
         PduType.StartResume => new StartResumePdu(),
         PduType.StopFreeze => new StopFreezePdu(),
         PduType.Acknowledge => new AcknowledgePdu(),
         PduType.ActionRequest => new ActionRequestPdu(),
         PduType.ActionResponse => new ActionResponsePdu(),
         PduType.DataQuery => new DataQueryPdu(),
         PduType.SetData => new SetDataPdu(),
         PduType.Data => new DataPdu(),
         PduType.EventReport => new EventReportPdu(),
         PduType.Comment => new CommentPdu(),
         PduType.ElectromagneticEmission => new ElectronicEmissionsPdu(),
         PduType.Designator => new DesignatorPdu(),
         PduType.Transmitter => new TransmitterPdu(),
         PduType.Signal => new SignalPdu(),
         PduType.Receiver => new ReceiverPdu(),
         PduType.IFF_ATC_NAVAIDS => new IffAtcNavAidsLayer1Pdu(),
         PduType.UnderwaterAcoustic => new UaPdu(),
         PduType.SupplementalEmissionEntityState => new SeesPdu(),
         PduType.IntercomSignal => new IntercomSignalPdu(),
         PduType.IntercomControl => new IntercomControlPdu(),
         PduType.AggregateState => new AggregateStatePdu(),
         PduType.IsGroupOf => new IsGroupOfPdu(),
         PduType.TransferControl => new TransferControlRequestPdu(),
         PduType.IsPartOf => new IsPartOfPdu(),
         PduType.MinefieldState => new MinefieldStatePdu(),
         PduType.MinefieldQuery => new MinefieldQueryPdu(),
         PduType.MinefieldData => new MinefieldDataPdu(),
         PduType.MinefieldResponseNAK => new MinefieldResponseNackPdu(),
         PduType.EnvironmentalProcess => new EnvironmentalProcessPdu(),
         PduType.GriddedData => new GriddedDataPdu(),
         PduType.PointObjectState => new PointObjectStatePdu(),
         PduType.LinearObjectState => new LinearObjectStatePdu(),
         PduType.ArealObjectState => new ArealObjectStatePdu(),
         PduType.TSPI => throw new NotSupportedException(),
         PduType.Appearance => throw new NotSupportedException(),
         PduType.ArticulatedParts => throw new NotSupportedException(),
         PduType.LEFire => throw new NotSupportedException(),
         PduType.LEDetonation => throw new NotSupportedException(),
         PduType.CreateEntityR => new CreateEntityReliablePdu(),
         PduType.RemoveEntityR => new RemoveEntityReliablePdu(),
         PduType.StartResumeR => new StartResumeReliablePdu(),
         PduType.StopFreezeR => new StopFreezeReliablePdu(),
         PduType.AcknowledgeR => new AcknowledgeReliablePdu(),
         PduType.ActionRequestR => new ActionRequestReliablePdu(),
         PduType.ActionResponseR => new ActionResponseReliablePdu(),
         PduType.DataQueryR => new DataQueryReliablePdu(),
         PduType.SetDataR => new SetDataReliablePdu(),
         PduType.DataR => new DataReliablePdu(),
         PduType.EventReportR => new EventReportReliablePdu(),
         PduType.CommentR => new CommentReliablePdu(),
         PduType.RecordR => new RecordQueryReliablePdu(),
         PduType.SetRecordR => new SetRecordReliablePdu(),
         PduType.RecordQueryR => new RecordQueryReliablePdu(),
         PduType.CollisionElastic => new CollisionElasticPdu(),
         PduType.EntityStateUpdate => new EntityStateUpdatePdu(),
         _ => null,
     });
Пример #39
0
        /// <summary>
        /// Used to unmarshal data back into the correct PDU type for protocol 5.
        /// </summary>
        /// <param name="pduType">PDU type</param>
        /// <param name="ds">Data stream that holds raw pdu data</param>
        /// <returns>Base PDU object that can be cast to specific PDU if needed</returns>
        /// <exception cref="NotSupportedException"></exception>
        public static Dis1995.Pdu UnmarshalRawPdu1995(PduType pduType, DataInputStream ds)
        {
            var pdu = new Dis1995.Pdu();

            switch (pduType)
            {
            case PduType.EntityState:
                pdu = new Dis1995.EntityStatePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Fire:
                pdu = new Dis1995.FirePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Detonation:
                pdu = new Dis1995.DetonationPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Collision:
                pdu = new Dis1995.CollisionPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ServiceRequest:
                pdu = new Dis1995.ServiceRequestPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ResupplyOffer:
                pdu = new Dis1995.ResupplyOfferPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ResupplyReceived:
                pdu = new Dis1995.ResupplyReceivedPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ResupplyCancel:
                pdu = new Dis1995.ResupplyCancelPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RepairComplete:
                pdu = new Dis1995.RepairCompletePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RepairResponse:
                pdu = new Dis1995.RepairResponsePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.CreateEntity:
                pdu = new Dis1995.CreateEntityPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.RemoveEntity:
                pdu = new Dis1995.RemoveEntityPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.StartResume:
                pdu = new Dis1995.StartResumePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Acknowledge:
                pdu = new Dis1995.AcknowledgePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ActionRequest:
                pdu = new Dis1995.ActionRequestPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.ActionResponse:
                pdu = new Dis1995.ActionResponsePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.DataQuery:
                pdu = new Dis1995.DataQueryPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.SetData:
                pdu = new Dis1995.SetDataPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.EventReport:
                pdu = new Dis1995.EventReportPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Comment:
                pdu = new Dis1995.CommentPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.StopFreeze:
                pdu = new Dis1995.StopFreezePdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Signal:
                pdu = new Dis1995.SignalPdu();
                pdu.Unmarshal(ds);
                break;

            case PduType.Transmitter:
                pdu = new Dis1995.TransmitterPdu();
                pdu.Unmarshal(ds);
                break;
            }

            return(pdu);
        }
Пример #40
0
 /// <summary>
 ///     Constructor.
 /// </summary>
 /// <remarks>
 ///     Initializes PDU class with supplied values.
 /// </remarks>
 /// <param name="vbs">VarBind list</param>
 /// <param name="type">PDU type</param>
 /// <param name="requestId">Request id</param>
 public Pdu(VbCollection vbs, PduType type, int requestId)
     : this(vbs)
 {
     _requestId.Value = requestId;
     _asnType         = (byte)type;
 }
Пример #41
0
        /// <summary>
        /// Creates the PDU.
        /// </summary>
        /// <param name="type">The type of PDU to be created.</param>
        /// <returns>Returns the corresponding PDU instance or null if PduType.Other is specified.</returns>
        /// <exception cref="NotImplementedException">if the PDU type specified in parameter is not supported.</exception>
        public static IPdu CreatePdu(PduType type)
        {
            IPdu pdu = null;

            switch (type)
            {
            case PduType.Other:
                pdu = new Pdu();
                break;

            case PduType.EntityState:
                pdu = new EntityStatePdu();
                break;

            case PduType.Fire:
                pdu = new FirePdu();
                break;

            case PduType.Detonation:
                pdu = new DetonationPdu();
                break;

            case PduType.Collision:
                pdu = new CollisionPdu();
                break;

            case PduType.ServiceRequest:
                pdu = new ServiceRequestPdu();
                break;

            case PduType.ResupplyOffer:
                pdu = new ResupplyOfferPdu();
                break;

            case PduType.ResupplyReceived:
                pdu = new ResupplyReceivedPdu();
                break;

            case PduType.ResupplyCancel:
                pdu = new ResupplyCancelPdu();
                break;

            case PduType.RepairComplete:
                pdu = new RepairCompletePdu();
                break;

            case PduType.RepairResponse:
                pdu = new RepairResponsePdu();
                break;

            case PduType.CreateEntity:
                pdu = new CreateEntityPdu();
                break;

            case PduType.RemoveEntity:
                pdu = new RemoveEntityPdu();
                break;

            case PduType.StartResume:
                pdu = new StartResumePdu();
                break;

            case PduType.StopFreeze:
                pdu = new StopFreezePdu();
                break;

            case PduType.Acknowledge:
                pdu = new AcknowledgePdu();
                break;

            case PduType.ActionRequest:
                pdu = new ActionRequestPdu();
                break;

            case PduType.ActionResponse:
                pdu = new ActionResponsePdu();
                break;

            case PduType.DataQuery:
                pdu = new DataQueryPdu();
                break;

            case PduType.SetData:
                pdu = new SetDataPdu();
                break;

            case PduType.Data:
                pdu = new DataPdu();
                break;

            case PduType.EventReport:
                pdu = new EventReportPdu();
                break;

            case PduType.Comment:
                pdu = new CommentPdu();
                break;

            case PduType.ElectromagneticEmission:
                throw new NotImplementedException();

            case PduType.Designator:
                pdu = new DesignatorPdu();
                break;

            case PduType.Transmitter:
                pdu = new TransmitterPdu();
                break;

            case PduType.Signal:
                pdu = new SignalPdu();
                break;

            case PduType.Receiver:
                pdu = new ReceiverPdu();
                break;

            default:
                throw new NotImplementedException();
            }

            return(pdu);
        }
Пример #42
0
        /// <summary>
        /// Creates the PDU.
        /// </summary>
        /// <param name="type">The type of PDU to be created.</param>
        /// <returns>Returns the corresponding PDU instance or null if PduType.Other is specified.</returns>
        /// <exception cref="NotImplementedException">if the PDU type specified in parameter is not supported.</exception>
        public static IPdu CreatePdu(PduType type)
        {
            IPdu pdu = null;

            switch (type)
            {
                case PduType.Other:
                    pdu = new Pdu();
                    break;
                case PduType.EntityState:
                    pdu = new EntityStatePdu();
                    break;
                case PduType.Fire:
                    pdu = new FirePdu();
                    break;
                case PduType.Detonation:
                    pdu = new DetonationPdu();
                    break;
                case PduType.Collision:
                    pdu = new CollisionPdu();
                    break;
                case PduType.ServiceRequest:
                    pdu = new ServiceRequestPdu();
                    break;
                case PduType.ResupplyOffer:
                    pdu = new ResupplyOfferPdu();
                    break;
                case PduType.ResupplyReceived:
                    pdu = new ResupplyReceivedPdu();
                    break;
                case PduType.ResupplyCancel:
                    pdu = new ResupplyCancelPdu();
                    break;
                case PduType.RepairComplete:
                    pdu = new RepairCompletePdu();
                    break;
                case PduType.RepairResponse:
                    pdu = new RepairResponsePdu();
                    break;
                case PduType.CreateEntity:
                    pdu = new CreateEntityPdu();
                    break;
                case PduType.RemoveEntity:
                    pdu = new RemoveEntityPdu();
                    break;
                case PduType.StartResume:
                    pdu = new StartResumePdu();
                    break;
                case PduType.StopFreeze:
                    pdu = new StopFreezePdu();
                    break;
                case PduType.Acknowledge:
                    pdu = new AcknowledgePdu();
                    break;
                case PduType.ActionRequest:
                    pdu = new ActionRequestPdu();
                    break;
                case PduType.ActionResponse:
                    pdu = new ActionResponsePdu();
                    break;
                case PduType.DataQuery:
                    pdu = new DataQueryPdu();
                    break;
                case PduType.SetData:
                    pdu = new SetDataPdu();
                    break;
                case PduType.Data:
                    pdu = new DataPdu();
                    break;
                case PduType.EventReport:
                    pdu = new EventReportPdu();
                    break;
                case PduType.Comment:
                    pdu = new CommentPdu();
                    break;
                case PduType.ElectromagneticEmission:
                    pdu = new ElectronicEmissionsPdu();
                    break;
                case PduType.Designator:
                    pdu = new DesignatorPdu();
                    break;
                case PduType.Transmitter:
                    pdu = new TransmitterPdu();
                    break;
                case PduType.Signal:
                    pdu = new SignalPdu();
                    break;
                case PduType.Receiver:
                    pdu = new ReceiverPdu();
                    break;
                case PduType.IFF_ATC_NAVAIDS:
                    pdu = new IffAtcNavAidsLayer1Pdu();
                    break;
                case PduType.UnderwaterAcoustic:
                    pdu = new UaPdu();
                    break;
                case PduType.SupplementalEmissionEntityState:
                    pdu = new SeesPdu();
                    break;
                case PduType.IntercomSignal:
                    pdu = new IntercomSignalPdu();
                    break;
                case PduType.IntercomControl:
                    pdu = new IntercomControlPdu();
                    break;
                case PduType.AggregateState:
                    pdu = new AggregateStatePdu();
                    break;
                case PduType.IsGroupOf:
                    pdu = new IsGroupOfPdu();
                    break;
                case PduType.TransferControl:
                    pdu = new TransferControlRequestPdu();
                    break;
                case PduType.IsPartOf:
                    pdu = new IsPartOfPdu();
                    break;
                case PduType.MinefieldState:
                    pdu = new MinefieldStatePdu();
                    break;
                case PduType.MinefieldQuery:
                    pdu = new MinefieldQueryPdu();
                    break;
                case PduType.MinefieldData:
                    pdu = new MinefieldDataPdu();
                    break;
                case PduType.MinefieldResponseNAK:
                    pdu = new MinefieldResponseNackPdu();
                    break;
                case PduType.EnvironmentalProcess:
                    pdu = new EnvironmentalProcessPdu();
                    break;
                case PduType.GriddedData:
                    pdu = new GriddedDataPdu();
                    break;
                case PduType.PointObjectState:
                    pdu = new PointObjectStatePdu();
                    break;
                case PduType.LinearObjectState:
                    pdu = new LinearObjectStatePdu();
                    break;
                case PduType.ArealObjectState:
                    pdu = new ArealObjectStatePdu();
                    break;
                case PduType.TSPI:
                    throw new NotImplementedException();
                case PduType.Appearance:
                    throw new NotImplementedException();
                case PduType.ArticulatedParts:
                    throw new NotImplementedException();
                case PduType.LEFire:
                    throw new NotImplementedException();
                case PduType.LEDetonation:
                    throw new NotImplementedException();
                case PduType.CreateEntityR:
                    pdu = new CreateEntityReliablePdu();
                    break;
                case PduType.RemoveEntityR:
                    pdu = new RemoveEntityReliablePdu();
                    break;
                case PduType.StartResumeR:
                    pdu = new StartResumeReliablePdu();
                    break;
                case PduType.StopFreezeR:
                    pdu = new StopFreezeReliablePdu();
                    break;
                case PduType.AcknowledgeR:
                    pdu = new AcknowledgeReliablePdu();
                    break;
                case PduType.ActionRequestR:
                    pdu = new ActionRequestReliablePdu();
                    break;
                case PduType.ActionResponseR:
                    pdu = new ActionResponseReliablePdu();
                    break;
                case PduType.DataQueryR:
                    pdu = new DataQueryReliablePdu();
                    break;
                case PduType.SetDataR:
                    pdu = new SetDataReliablePdu();
                    break;
                case PduType.DataR:
                    pdu = new DataReliablePdu();
                    break;
                case PduType.EventReportR:
                    pdu = new EventReportReliablePdu();
                    break;
                case PduType.CommentR:
                    pdu = new CommentReliablePdu();
                    break;
                case PduType.RecordR:
                    pdu = new RecordQueryReliablePdu();
                    break;
                case PduType.SetRecordR:
                    pdu = new SetRecordReliablePdu();
                    break;
                case PduType.RecordQueryR:
                    pdu = new RecordQueryReliablePdu();
                    break;
                case PduType.CollisionElastic:
                    pdu = new CollisionElasticPdu();
                    break;
                case PduType.EntityStateUpdate:
                    pdu = new EntityStateUpdatePdu();
                    break;
                default:
                    pdu = null;
                    break;
            }

            return pdu;
        }