Commit 2eef92c2 authored by Brickner_cp's avatar Brickner_cp

ICMP

parent bab1a144
......@@ -79,7 +79,7 @@ namespace PcapDotNet.Packets.Test
IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
for (int i = 0; i != 1000; ++i)
for (int i = 0; i != 2000; ++i)
{
IcmpLayer icmpLayer = random.NextIcmpLayer();
icmpLayer.Checksum = null;
......@@ -103,7 +103,8 @@ namespace PcapDotNet.Packets.Test
icmpIpV4PayloadLayers = new[]
{
random.NextPayloadLayer(
IcmpConversionFailedDatagram.OriginalDatagramLengthForUnsupportedTransportProtocol - icmpIpV4Layer.Length)
IcmpConversionFailedDatagram.OriginalDatagramLengthForUnsupportedTransportProtocol -
icmpIpV4Layer.Length)
};
else
{
......@@ -159,19 +160,19 @@ namespace PcapDotNet.Packets.Test
switch (icmpLayer.MessageType)
{
// case IcmpMessageType.DestinationUnreachable:
// case IcmpMessageType.TimeExceeded:
// case IcmpMessageType.DestinationUnreachable:
// case IcmpMessageType.TimeExceeded:
case IcmpMessageType.ParameterProblem:
((IcmpParameterProblemLayer)icmpLayer).Pointer %= (byte)icmpPayloadLength;
break;
// case IcmpMessageType.SourceQuench:
// case IcmpMessageType.Redirect:
// case IcmpMessageType.SourceQuench:
// case IcmpMessageType.Redirect:
case IcmpMessageType.SecurityFailures:
((IcmpSecurityFailuresLayer)icmpLayer).Pointer %= (ushort)icmpPayloadLength;
// icmpIpV4Layer = random.NextIpV4Layer();
// icmpIpV4PayloadLayers = new[] {random.NextPayloadLayer(IcmpIpV4HeaderPlus64BitsPayloadDatagram.OriginalDatagramPayloadLength)};
// icmpIpV4Layer = random.NextIpV4Layer();
// icmpIpV4PayloadLayers = new[] {random.NextPayloadLayer(IcmpIpV4HeaderPlus64BitsPayloadDatagram.OriginalDatagramPayloadLength)};
break;
// case IcmpMessageType.ConversionFailed:
// case IcmpMessageType.ConversionFailed:
}
PacketBuilder packetBuilder;
......@@ -181,9 +182,25 @@ namespace PcapDotNet.Packets.Test
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, icmpLayer);
Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid, "IsValid");
byte[] buffer = (byte[])packet.Buffer.Clone();
buffer.Write(ethernetLayer.Length + ipV4Layer.Length, random.NextDatagram(icmpLayer.Length));
Packet illegalPacket = new Packet(buffer, DateTime.Now, packet.DataLink);
Assert.IsFalse(illegalPacket.IsValid, "IsInvalid");
if (illegalPacket.Ethernet.IpV4.Icmp is IcmpUnknownDatagram)
{
byte[] icmpBuffer = new byte[illegalPacket.Ethernet.IpV4.Icmp.ExtractLayer().Length];
ILayer layer = illegalPacket.Ethernet.IpV4.Icmp.ExtractLayer();
layer.Write(icmpBuffer,0,icmpBuffer.Length, null,null);
layer.Finalize(icmpBuffer,0,icmpBuffer.Length,null);
MoreAssert.AreSequenceEqual(illegalPacket.Ethernet.IpV4.Icmp.ToArray(),
icmpBuffer);
Assert.AreEqual(illegalPacket,
new PacketBuilder(ethernetLayer, ipV4Layer, illegalPacket.Ethernet.IpV4.Icmp.ExtractLayer()).Build(DateTime.Now));
}
// Ethernet
ethernetLayer.EtherType = EthernetType.IpV4;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
......@@ -200,49 +217,53 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.IpV4.Version);
// ICMP
IcmpLayer actualIcmpLayer = (IcmpLayer)packet.Ethernet.IpV4.Icmp.ExtractLayer();
IcmpDatagram actualIcmp = packet.Ethernet.IpV4.Icmp;
IcmpLayer actualIcmpLayer = (IcmpLayer)actualIcmp.ExtractLayer();
icmpLayer.Checksum = actualIcmpLayer.Checksum;
Assert.AreEqual(icmpLayer, actualIcmpLayer);
Assert.IsTrue(packet.Ethernet.IpV4.Icmp.IsChecksumCorrect);
Assert.AreEqual(icmpLayer.MessageType, packet.Ethernet.IpV4.Icmp.MessageType);
Assert.AreEqual(icmpLayer.CodeValue, packet.Ethernet.IpV4.Icmp.Code);
// switch (packet.Ethernet.IpV4.Icmp.MessageType)
// {
// case IcmpMessageType.DestinationUnreachable:
//// Assert.AreEqual(icmpIpV4Layer, packet.Ethernet.IpV4.Icmp.DestinationUncreachable.IpV4.ExtractLayer());
//
// case IcmpMessageType.TimeExceeded:
// case IcmpMessageType.ParameterProblem:
// case IcmpMessageType.SourceQuench:
// case IcmpMessageType.Redirect:
// case IcmpMessageType.ConversionFailed:
// isIpV4Payload = true;
// break;
//
// case IcmpMessageType.Echo:
// case IcmpMessageType.EchoReply:
// case IcmpMessageType.Timestamp:
// case IcmpMessageType.TimestampReply:
// case IcmpMessageType.InformationRequest:
// case IcmpMessageType.InformationReply:
// case IcmpMessageType.RouterAdvertisement:
// case IcmpMessageType.RouterSolicitation:
//// packet.Ethernet.IpV4.Icmp.RouterSolicitation
// case IcmpMessageType.AddressMaskRequest:
// case IcmpMessageType.AddressMaskReply:
// case IcmpMessageType.Traceroute:
// case IcmpMessageType.DomainNameRequest:
// case IcmpMessageType.SecurityFailures:
// isIpV4Payload = false;
// break;
//
// case IcmpMessageType.DomainNameReply:
//
// default:
// throw new InvalidOperationException("Invalid icmpMessageType " + packet.Ethernet.IpV4.Icmp.MessageType);
//
// }
Assert.AreNotEqual(random.NextIcmpLayer(), actualIcmpLayer);
Assert.IsTrue(actualIcmp.IsChecksumCorrect);
Assert.AreEqual(icmpLayer.MessageType, actualIcmp.MessageType);
Assert.AreEqual(icmpLayer.CodeValue, actualIcmp.Code);
Assert.AreEqual(icmpLayer.MessageTypeAndCode, actualIcmp.MessageTypeAndCode);
Assert.AreEqual(packet.Length - ethernetLayer.Length - ipV4Layer.Length - IcmpDatagram.HeaderLength, actualIcmp.Payload.Length);
Assert.IsNotNull(icmpLayer.ToString());
switch (packet.Ethernet.IpV4.Icmp.MessageType)
{
case IcmpMessageType.DestinationUnreachable:
case IcmpMessageType.RouterSolicitation:
case IcmpMessageType.SourceQuench:
case IcmpMessageType.TimeExceeded:
Assert.AreEqual<uint>(0, actualIcmp.Variable);
break;
case IcmpMessageType.ParameterProblem:
case IcmpMessageType.Redirect:
case IcmpMessageType.ConversionFailed:
case IcmpMessageType.Echo:
case IcmpMessageType.EchoReply:
case IcmpMessageType.Timestamp:
case IcmpMessageType.TimestampReply:
case IcmpMessageType.InformationRequest:
case IcmpMessageType.InformationReply:
case IcmpMessageType.RouterAdvertisement:
case IcmpMessageType.AddressMaskRequest:
case IcmpMessageType.AddressMaskReply:
break;
case IcmpMessageType.Traceroute:
Assert.AreEqual(((IcmpTracerouteLayer)icmpLayer).OutboundHopCount == 0xFFFF, ((IcmpTracerouteDatagram)actualIcmp).IsOutbound);
break;
case IcmpMessageType.DomainNameRequest:
case IcmpMessageType.SecurityFailures:
break;
break;
case IcmpMessageType.DomainNameReply:
default:
throw new InvalidOperationException("Invalid icmpMessageType " + packet.Ethernet.IpV4.Icmp.MessageType);
}
}
}
}
......
namespace PcapDotNet.Packets.Icmp
{
/// <summary>
/// RFC 950.
/// <pre>
/// +-----+------+------+-----------------+
/// | Bit | 0-7 | 8-15 | 16-31 |
/// +-----+------+------+-----------------+
/// | 0 | Type | Code | Checksum |
/// +-----+------+------+-----------------+
/// | 32 | Identifier | Sequence Number |
/// +-----+-------------+-----------------+
/// | 64 | Address Mask |
/// +-----+-------------------------------+
/// </pre>
/// </summary>
public class IcmpAddressMaskReplyDatagram : IcmpAddressMaskRequestDatagram
{
internal IcmpAddressMaskReplyDatagram(byte[] buffer, int offset, int length)
......
......@@ -11,11 +11,11 @@ namespace PcapDotNet.Packets.Icmp
get { return IcmpMessageType.AddressMaskRequest; }
}
public override int Length
protected override int PayloadLength
{
get
{
return base.Length + IcmpAddressMaskRequestDatagram.PayloadLength;
return IcmpAddressMaskRequestDatagram.PayloadLength;
}
}
......
......@@ -208,6 +208,8 @@ namespace PcapDotNet.Packets.Icmp
return new IcmpSecurityFailuresDatagram(buffer, offset, length);
case IcmpMessageType.RouterSolicitation:
return new IcmpRouterSolicitationDatagram(buffer, offset, length);
case IcmpMessageType.DomainNameReply: // Domain Name Reply is unsupported
default:
return new IcmpUnknownDatagram(buffer, offset, length);
......
......@@ -24,9 +24,14 @@ namespace PcapDotNet.Packets.Icmp
get { return 0; }
}
public override int Length
public override sealed int Length
{
get { return IcmpDatagram.HeaderLength; }
get { return IcmpDatagram.HeaderLength + PayloadLength; }
}
protected virtual int PayloadLength
{
get { return 0; }
}
protected override sealed void Write(byte[] buffer, int offset)
......
......@@ -121,7 +121,7 @@ namespace PcapDotNet.Packets.Icmp
{
}
internal static int GetHeaderAdditionalLength(int numEntries)
internal static int GetPayloadLength(int numEntries)
{
return numEntries * DefaultAddressEntrySize * IpV4Address.SizeOf;
}
......
......@@ -24,11 +24,11 @@ namespace PcapDotNet.Packets.Icmp
}
}
public override int Length
protected override int PayloadLength
{
get
{
return base.Length + IcmpRouterAdvertisementDatagram.GetHeaderAdditionalLength(Entries.Count);
return IcmpRouterAdvertisementDatagram.GetPayloadLength(Entries.Count);
}
}
......
namespace PcapDotNet.Packets.Icmp
{
/// <summary>
/// RFC 1256.
/// <pre>
/// +-----+------+------+-----------+
/// | Bit | 0-7 | 8-15 | 16-31 |
/// +-----+------+------+-----------+
/// | 0 | Type | Code | Checksum |
/// +-----+------+------+-----------+
/// | 32 | reserved |
/// +-----+-------------------------+
/// </pre>
/// </summary>
public class IcmpRouterSolicitationDatagram : IcmpDatagram
{
internal IcmpRouterSolicitationDatagram(byte[] buffer, int offset, int length)
: base(buffer, offset, length)
{
}
public override ILayer ExtractLayer()
{
return new IcmpRouterSolicitationLayer();
}
}
}
\ No newline at end of file
using System;
namespace PcapDotNet.Packets.Icmp
{
/// <summary>
......@@ -30,6 +32,5 @@ namespace PcapDotNet.Packets.Icmp
Checksum = Checksum
};
}
}
}
\ No newline at end of file
......@@ -12,11 +12,11 @@ namespace PcapDotNet.Packets.Icmp
get { return IcmpMessageType.Timestamp; }
}
public override int Length
protected override int PayloadLength
{
get
{
return base.Length + IcmpTimestampDatagram.PayloadLength;
return IcmpTimestampDatagram.PayloadLength;
}
}
......
namespace PcapDotNet.Packets.Icmp
{
/// <summary>
/// RFC 792.
/// <pre>
/// +-----+------+------+-----------------+
/// | Bit | 0-7 | 8-15 | 16-31 |
/// +-----+------+------+-----------------+
/// | 0 | Type | Code | Checksum |
/// +-----+------+------+-----------------+
/// | 32 | Identifier | Sequence Number |
/// +-----+-------------+-----------------+
/// | 64 | Originate Timestamp |
/// +-----+-------------------------------+
/// | 96 | Receive Timestamp |
/// +-----+-------------------------------+
/// | 128 | Transmit Timestamp |
/// +-----+-------------------------------+
/// </pre>
/// </summary>
public class IcmpTimestampReplyDatagram : IcmpTimestampDatagram
{
internal IcmpTimestampReplyDatagram(byte[] buffer, int offset, int length)
......
......@@ -21,11 +21,11 @@ namespace PcapDotNet.Packets.Icmp
get { return IcmpMessageType.Traceroute; }
}
public override int Length
protected override int PayloadLength
{
get
{
return base.Length + IcmpTracerouteDatagram.PayloadLength;
return IcmpTracerouteDatagram.PayloadLength;
}
}
......
......@@ -19,14 +19,9 @@ namespace PcapDotNet.Packets.Icmp
};
}
protected override byte MinCodeValue
protected override bool CalculateIsValid()
{
get { return byte.MinValue; }
}
protected override byte MaxCodeValue
{
get { return byte.MaxValue; }
return false;
}
}
}
\ No newline at end of file
......@@ -15,6 +15,22 @@ namespace PcapDotNet.Packets.Icmp
}
}
public override byte CodeValue
{
get
{
return LayerCode;
}
}
protected override int PayloadLength
{
get
{
return Payload.Length;
}
}
protected override uint Value
{
get { return LayerValue; }
......
......@@ -99,6 +99,7 @@
<Compile Include="Icmp\IcmpRedirectLayer.cs" />
<Compile Include="Icmp\IcmpRouterAdvertisementEntry.cs" />
<Compile Include="Icmp\IcmpRouterAdvertisementLayer.cs" />
<Compile Include="Icmp\IcmpRouterSolicitationDatagram.cs" />
<Compile Include="Icmp\IcmpRouterSolicitationLayer.cs" />
<Compile Include="Icmp\IcmpSecurityFailuresLayer.cs" />
<Compile Include="Icmp\IcmpSourceQuenchDatagram.cs" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment