void SendIcmpMessageInBackground(UInt32 destinationIPAddress, IcmpMessageType icmpMessageType, IcmpMessageCode icmpMessageCode, byte[] restOfHeader, byte[] data)
        {
            IcmpMessage icmpMessage = new IcmpMessage(destinationIPAddress, icmpMessageType, icmpMessageCode, restOfHeader, data);

            _sendIcmpMessagesInBackgroundQueue.Enqueue(icmpMessage);
            _sendIcmpMessagesInBackgroundEvent.Set();
        }
Esempio n. 2
0
 internal static void WriteHeader(byte[] buffer, int offset,
                                  IcmpMessageType messageType, byte code, uint valueAccordingToType)
 {
     buffer.Write(offset + Offset.Type, (byte)messageType);
     buffer.Write(offset + Offset.Code, code);
     buffer.Write(offset + Offset.Variable, valueAccordingToType, Endianity.Big);
 }
Esempio n. 3
0
        internal static IcmpDatagram CreateInstance(IcmpMessageType messageType, byte[] buffer, int offset, int length)
        {
            IcmpDatagram prototype;
            if (!_prototypes.TryGetValue(messageType, out prototype))
                return new IcmpUnknownDatagram(buffer, offset, length);

            return prototype.CreateInstance(buffer, offset, length);
        }
Esempio n. 4
0
        internal static IcmpDatagram CreateInstance(IcmpMessageType messageType, byte[] buffer, int offset, int length)
        {
            IcmpDatagram icmpDatagram;

            if (!IcmpDatagramFactory._prototypes.TryGetValue(messageType, out icmpDatagram))
            {
                return((IcmpDatagram) new IcmpUnknownDatagram(buffer, offset, length));
            }
            return(icmpDatagram.CreateInstance(buffer, offset, length));
        }
Esempio n. 5
0
        internal static IcmpDatagram CreateInstance(IcmpMessageType messageType, byte[] buffer, int offset, int length)
        {
            IcmpDatagram prototype;

            if (!_prototypes.TryGetValue(messageType, out prototype))
            {
                return(new IcmpUnknownDatagram(buffer, offset, length));
            }

            return(prototype.CreateInstance(buffer, offset, length));
        }
Esempio n. 6
0
        /// <summary>
        ///		Create a new Icmp packet.
        /// </summary>
        /// <param name="data">
        ///		The byte array representing the Icmp packet.
        ///	</param>
        public IcmpPacket(byte[] data)
        {
            // copy out the message type
            m_type = (IcmpMessageType)data[0];

            // copy out the code
            m_code = data[1];

            // copy out the checksum
            m_checksum = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 2));

            // and the rest of the data
            m_data = new byte[data.Length - 4];
            Array.Copy(data, 4, m_data, 0, m_data.Length);
        }
Esempio n. 7
0
        /// <summary>
        /// Creates an IcmpDatagram from a buffer according to the message type.
        /// </summary>
        /// <param name="buffer">The buffer of the datagram.</param>
        /// <param name="offset">The offset where the datagram starts.</param>
        /// <param name="length">The length of the datagram in the buffer.</param>
        /// <returns>An IcmpDatagram according to the Icmp message type.</returns>
        public static IcmpDatagram CreateDatagram(byte[] buffer, int offset, int length)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }

            if (length <= Offset.Type)
            {
                return(new IcmpUnknownDatagram(buffer, offset, length));
            }

            IcmpMessageType messageType = (IcmpMessageType)buffer[offset + Offset.Type];

            return(IcmpDatagramFactory.CreateInstance(messageType, buffer, offset, length));
        }
        void SendIcmpMessage(UInt32 destinationIPAddress, IcmpMessageType icmpMessageType, IcmpMessageCode icmpMessageCode, byte[] restOfHeader, byte[] data, Int64 timeoutInMachineTicks)
        {
            if (_isDisposed)
            {
                return;
            }

            lock (_icmpFrameBufferLock)
            {
                // configure ICMPv4 frame
                /* Type */
                _icmpFrameBuffer[0] = (byte)icmpMessageType;
                /* Code (Subtype) */
                _icmpFrameBuffer[1] = (byte)icmpMessageCode;
                /* checksum (clear this for now; we will calculate it shortly) */
                Array.Clear(_icmpFrameBuffer, 2, 2);
                /* restOfHeader */
                if (restOfHeader.Length < 4)
                {
                    Array.Clear(_icmpFrameBuffer, 4, 4);
                }
                Array.Copy(restOfHeader, 0, _icmpFrameBuffer, 4, System.Math.Min(4, restOfHeader.Length));

                UInt16 checksum;
                lock (_checksumLock)
                {
                    // calculate checksum over entire ICMP frame including data
                    _checksumBufferArray[0] = _icmpFrameBuffer;
                    _checksumOffsetArray[0] = 0;
                    _checksumCountArray[0]  = ICMP_FRAME_BUFFER_LENGTH;
                    _checksumBufferArray[1] = data;
                    _checksumOffsetArray[1] = 0;
                    _checksumCountArray[1]  = data.Length;
                    checksum = Utility.CalculateInternetChecksum(_checksumBufferArray, _checksumOffsetArray, _checksumCountArray, 2);
                }
                _icmpFrameBuffer[2] = (byte)((checksum >> 8) & 0xFF);
                _icmpFrameBuffer[3] = (byte)(checksum & 0xFF);

                _bufferArray[0] = _icmpFrameBuffer;
                _indexArray[0]  = 0;
                _countArray[0]  = ICMP_FRAME_BUFFER_LENGTH;
                _bufferArray[1] = data;
                _indexArray[1]  = 0;
                _countArray[1]  = data.Length;
                _ipv4Layer.Send(1 /* PROTOCOL for ICMP */, _ipv4Layer.IPAddress, destinationIPAddress, _bufferArray, _indexArray, _countArray, timeoutInMachineTicks);
            }
        }
 public IcmpMessage(UInt32 destinationIPAddress, IcmpMessageType icmpMessageType, IcmpMessageCode icmpMessageCode, byte[] restOfHeader, byte[] data)
 {
     this.DestinationIPAddress = destinationIPAddress;
     this.IcmpMessageType      = icmpMessageType;
     this.IcmpMessageCode      = icmpMessageCode;
     this.RestOfHeader         = new byte[4];
     if (restOfHeader != null)
     {
         Array.Copy(restOfHeader, this.RestOfHeader, System.Math.Min(this.RestOfHeader.Length, restOfHeader.Length));
     }
     if (data != null)
     {
         this.Data = data;
     }
     else
     {
         this.Data = new byte[0];
     }
 }
Esempio n. 10
0
 public IcmpMessage(UInt32 destinationIPAddress, IcmpMessageType icmpMessageType, IcmpMessageCode icmpMessageCode, byte[] restOfHeader, byte[] data)
 {
     this.DestinationIPAddress = destinationIPAddress;
     this.IcmpMessageType = icmpMessageType;
     this.IcmpMessageCode = icmpMessageCode;
     this.RestOfHeader = new byte[4];
     if (restOfHeader != null)
     {
         Array.Copy(restOfHeader, this.RestOfHeader, System.Math.Min(this.RestOfHeader.Length, restOfHeader.Length));
     }
     if (data != null)
     {
         this.Data = data;
     }
     else
     {
         this.Data = new byte[0];
     }
 }
Esempio n. 11
0
        /// <summary>
        ///		Create a new Icmp packet.
        /// </summary>
        /// <param name="data">
        ///		The byte array representing the Icmp packet.
        ///	</param>
        public IcmpPacket(byte[] data)
        {
            // copy out the message type
            m_type = (IcmpMessageType)data[0];

            // copy out the code
            m_code = data[1];

            // copy out the checksum
            m_checksum = (ushort)IPAddress.NetworkToHostOrder (BitConverter.ToInt16 (data, 2));

            // and the rest of the data
            m_data = new byte[data.Length - 4];
            Array.Copy (data, 4, m_data, 0, m_data.Length);
        }
Esempio n. 12
0
 internal static void WriteHeader(byte[] buffer, int offset, IcmpMessageType messageType, byte code, uint valueAccordingToType)
 {
     ByteArrayExtensions.Write(buffer, offset, (byte)messageType);
     ByteArrayExtensions.Write(buffer, offset + 1, code);
     ByteArrayExtensions.Write(buffer, offset + 4, valueAccordingToType, Endianity.Big);
 }
        public static IcmpLayer NextIcmpLayer(this Random random)
        {
            IcmpMessageType icmpMessageType = random.NextEnum(IcmpMessageType.DomainNameReply);
            ushort?         checksum        = random.NextBool() ? (ushort?)random.NextUShort() : null;

            switch (icmpMessageType)
            {
            case IcmpMessageType.DestinationUnreachable:
                return(new IcmpDestinationUnreachableLayer
                {
                    Code = random.NextEnum <IcmpCodeDestinationUnreachable>(),
                    Checksum = checksum,
                    NextHopMaximumTransmissionUnit = random.NextUShort(),
                });

            case IcmpMessageType.TimeExceeded:
                return(new IcmpTimeExceededLayer
                {
                    Code = random.NextEnum <IcmpCodeTimeExceeded>(),
                    Checksum = checksum,
                });

            case IcmpMessageType.ParameterProblem:
                return(new IcmpParameterProblemLayer
                {
                    Checksum = checksum,
                    Pointer = random.NextByte()
                });

            case IcmpMessageType.SourceQuench:
                return(new IcmpSourceQuenchLayer
                {
                    Checksum = checksum
                });

            case IcmpMessageType.Redirect:
                return(new IcmpRedirectLayer
                {
                    Code = random.NextEnum <IcmpCodeRedirect>(),
                    Checksum = checksum,
                    GatewayInternetAddress = random.NextIpV4Address()
                });

            case IcmpMessageType.Echo:
                return(new IcmpEchoLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort()
                });

            case IcmpMessageType.EchoReply:
                return(new IcmpEchoReplyLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort()
                });


            case IcmpMessageType.Timestamp:
                return(new IcmpTimestampLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort(),
                    OriginateTimestamp = random.NextIpV4TimeOfDay(),
                    ReceiveTimestamp = random.NextIpV4TimeOfDay(),
                    TransmitTimestamp = random.NextIpV4TimeOfDay()
                });

            case IcmpMessageType.TimestampReply:
                return(new IcmpTimestampReplyLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort(),
                    OriginateTimestamp = random.NextIpV4TimeOfDay(),
                    ReceiveTimestamp = random.NextIpV4TimeOfDay(),
                    TransmitTimestamp = random.NextIpV4TimeOfDay()
                });

            case IcmpMessageType.InformationRequest:
                return(new IcmpInformationRequestLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort(),
                });

            case IcmpMessageType.InformationReply:
                return(new IcmpInformationReplyLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort(),
                });


            case IcmpMessageType.RouterAdvertisement:
                return(new IcmpRouterAdvertisementLayer
                {
                    Entries = random.NextIcmpRouterAdvertisementEntries(random.Next(10)).ToList().AsReadOnly(),
                    Checksum = checksum,
                    Lifetime = random.NextTimeSpan(TimeSpan.Zero, TimeSpan.FromSeconds(ushort.MaxValue)),
                });

            case IcmpMessageType.RouterSolicitation:
                return(new IcmpRouterSolicitationLayer
                {
                    Checksum = checksum,
                });

            case IcmpMessageType.AddressMaskRequest:
                return(new IcmpAddressMaskRequestLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort(),
                    AddressMask = random.NextIpV4Address()
                });

            case IcmpMessageType.AddressMaskReply:
                return(new IcmpAddressMaskReplyLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort(),
                    AddressMask = random.NextIpV4Address()
                });

            case IcmpMessageType.TraceRoute:
                return(new IcmpTraceRouteLayer
                {
                    Code = random.NextEnum <IcmpCodeTraceRoute>(),
                    Checksum = checksum,
                    Identification = random.NextUShort(),
                    OutboundHopCount = random.NextUShort(),
                    ReturnHopCount = random.NextUShort(),
                    OutputLinkSpeed = random.NextUInt(),
                    OutputLinkMaximumTransmissionUnit = random.NextUInt(),
                });

            case IcmpMessageType.ConversionFailed:
                return(new IcmpConversionFailedLayer
                {
                    Code = random.NextEnum <IcmpCodeConversionFailed>(),
                    Checksum = checksum,
                    Pointer = random.NextUInt(),
                });

            case IcmpMessageType.DomainNameRequest:
                return(new IcmpDomainNameRequestLayer
                {
                    Checksum = checksum,
                    Identifier = random.NextUShort(),
                    SequenceNumber = random.NextUShort(),
                });

            case IcmpMessageType.DomainNameReply:
                throw new NotSupportedException("Message Type " + icmpMessageType + " is not supported");

            case IcmpMessageType.SecurityFailures:
                return(new IcmpSecurityFailuresLayer
                {
                    Code = random.NextEnum <IcmpCodeSecurityFailure>(),
                    Checksum = checksum,
                    Pointer = random.NextUShort()
                });

            default:
                throw new InvalidOperationException("Invalid icmpMessageType " + icmpMessageType);
            }
        }
        internal void OnPacketReceived(UInt32 sourceIPAddress, byte[] buffer, Int32 index, Int32 count)
        {
            if (count < ICMP_HEADER_LENGTH)
            {
                return;
            }

            UInt16 verifyChecksum;

            lock (_checksumLock)
            {
                // calculate checksum over entire ICMP frame including data
                _checksumBufferArray[0] = buffer;
                _checksumOffsetArray[0] = index;
                _checksumCountArray[0]  = count;
                verifyChecksum          = Utility.CalculateInternetChecksum(_checksumBufferArray, _checksumOffsetArray, _checksumCountArray, 1);
            }

            if (verifyChecksum != 0x0000)
            {
                return;
            }

            /* parse ICMP message */
            /* Type */
            IcmpMessageType icmpMessageType = (IcmpMessageType)buffer[index + 0];
            /* Code (Subtype) */
            IcmpMessageCode icmpMessageCode = (IcmpMessageCode)buffer[index + 1];

            /* Rest of header */
            byte[] restOfHeader = new byte[4];
            Array.Copy(buffer, index + 4, restOfHeader, 0, restOfHeader.Length);
            /* Data */
            byte[] data = new byte[count - 8];
            Array.Copy(buffer, index + 8, data, 0, data.Length);

            /* process ICMP message */
            switch (icmpMessageType)
            {
            case IcmpMessageType.Echo:
            {
                SendIcmpMessageInBackground(sourceIPAddress, IcmpMessageType.EchoReply, IcmpMessageCode.None, restOfHeader, data);
            }
            break;

            //case IcmpMessageType.EchoReply:
            //    {
            //        lock (_outstandingEchoRequestsLock)
            //        {
            //            for (int i = 0; i < _outstandingEchoRequests.Count; i++)
            //            {
            //                if (_outstandingEchoRequests[i] != null)
            //                {
            //                    // check to see if this request matches
            //                    EchoRequest echoRequest = (EchoRequest)_outstandingEchoRequests[i];
            //                    if (echoRequest.DestinationIPAddress == sourceIPAddress)
            //                    {
            //                        /* parse restOfHeader */
            //                        UInt16 identifier = (UInt16)((restOfHeader[0] << 8) + restOfHeader[1]);
            //                        UInt16 sequenceNumber = (UInt16)((restOfHeader[2] << 8) + restOfHeader[3]);
            //                        if ((echoRequest.Identifier == identifier) && (echoRequest.SequenceNumber == sequenceNumber) && (echoRequest.Data.Length == data.Length))
            //                        {
            //                            bool dataMatches = true;
            //                            for (int iData = 0; iData < data.Length; iData++)
            //                            {
            //                                if (data[iData] != echoRequest.Data[iData])
            //                                {
            //                                    dataMatches = false;
            //                                    break;
            //                                }
            //                            }
            //                            if (dataMatches)
            //                                echoRequest.SetResponseReceived();
            //                        }
            //                    }
            //                }
            //            }
            //        }
            //    }
            //    break;
            default:
                break;
            }
        }
Esempio n. 15
0
 internal static void WriteHeader(byte[] buffer, int offset,
                                  IcmpMessageType messageType, byte code, uint valueAccordingToType)
 {
     buffer.Write(offset + Offset.Type, (byte)messageType);
     buffer.Write(offset + Offset.Code, code);
     buffer.Write(offset + Offset.Variable, valueAccordingToType, Endianity.Big);
 }
 public IcmpDatagramRegistrationAttribute(IcmpMessageType messageType)
 {
     MessageType = messageType;
 }
Esempio n. 17
0
 void SendIcmpMessageInBackground(UInt32 destinationIPAddress, IcmpMessageType icmpMessageType, IcmpMessageCode icmpMessageCode, byte[] restOfHeader, byte[] data)
 {
     IcmpMessage icmpMessage = new IcmpMessage(destinationIPAddress, icmpMessageType, icmpMessageCode, restOfHeader, data);
     _sendIcmpMessagesInBackgroundQueue.Enqueue(icmpMessage);
     _sendIcmpMessagesInBackgroundEvent.Set();
 }
 public IcmpDatagramRegistrationAttribute(IcmpMessageType messageType)
 {
     MessageType = messageType;
 }
Esempio n. 19
0
        void SendIcmpMessage(UInt32 destinationIPAddress, IcmpMessageType icmpMessageType, IcmpMessageCode icmpMessageCode, byte[] restOfHeader, byte[] data, Int64 timeoutInMachineTicks)
        {
            if (_isDisposed) return;

            lock (_icmpFrameBufferLock)
            {
                // configure ICMPv4 frame
                /* Type */
                _icmpFrameBuffer[0] = (byte)icmpMessageType;
                /* Code (Subtype) */
                _icmpFrameBuffer[1] = (byte)icmpMessageCode;
                /* checksum (clear this for now; we will calculate it shortly) */
                Array.Clear(_icmpFrameBuffer, 2, 2);
                /* restOfHeader */
                if (restOfHeader.Length < 4) Array.Clear(_icmpFrameBuffer, 4, 4);
                Array.Copy(restOfHeader, 0, _icmpFrameBuffer, 4, System.Math.Min(4, restOfHeader.Length));

                UInt16 checksum;
                lock (_checksumLock)
                {
                    // calculate checksum over entire ICMP frame including data
                    _checksumBufferArray[0] = _icmpFrameBuffer;
                    _checksumOffsetArray[0] = 0;
                    _checksumCountArray[0] = ICMP_FRAME_BUFFER_LENGTH;
                    _checksumBufferArray[1] = data;
                    _checksumOffsetArray[1] = 0;
                    _checksumCountArray[1] = data.Length;
                    checksum = Utility.CalculateInternetChecksum(_checksumBufferArray, _checksumOffsetArray, _checksumCountArray, 2);
                }
                _icmpFrameBuffer[2] = (byte)((checksum >> 8) & 0xFF);
                _icmpFrameBuffer[3] = (byte)(checksum & 0xFF);

                _bufferArray[0] = _icmpFrameBuffer;
                _indexArray[0] = 0;
                _countArray[0] = ICMP_FRAME_BUFFER_LENGTH;
                _bufferArray[1] = data;
                _indexArray[1] = 0;
                _countArray[1] = data.Length;
                _ipv4Layer.Send(1 /* PROTOCOL for ICMP */, _ipv4Layer.IPAddress, destinationIPAddress, _bufferArray, _indexArray, _countArray, timeoutInMachineTicks);
            }
        }