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(); }
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); }
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); }
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)); }
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)); }
/// <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); }
/// <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]; } }
/// <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); }
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; } }
public IcmpDatagramRegistrationAttribute(IcmpMessageType messageType) { MessageType = messageType; }
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); } }