Commit 2eef92c2 authored by Brickner_cp's avatar Brickner_cp

ICMP

parent bab1a144
...@@ -79,13 +79,13 @@ namespace PcapDotNet.Packets.Test ...@@ -79,13 +79,13 @@ namespace PcapDotNet.Packets.Test
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 2000; ++i)
{ {
IcmpLayer icmpLayer = random.NextIcmpLayer(); IcmpLayer icmpLayer = random.NextIcmpLayer();
icmpLayer.Checksum = null; icmpLayer.Checksum = null;
IpV4Layer icmpIpV4Layer = null; IpV4Layer icmpIpV4Layer = null;
IEnumerable<ILayer> icmpIpV4PayloadLayers = null; IEnumerable<ILayer> icmpIpV4PayloadLayers = null;
switch (icmpLayer.MessageType) switch (icmpLayer.MessageType)
{ {
case IcmpMessageType.DestinationUnreachable: case IcmpMessageType.DestinationUnreachable:
...@@ -101,10 +101,11 @@ namespace PcapDotNet.Packets.Test ...@@ -101,10 +101,11 @@ namespace PcapDotNet.Packets.Test
icmpIpV4Layer = random.NextIpV4Layer(); icmpIpV4Layer = random.NextIpV4Layer();
if (icmpLayer.MessageTypeAndCode == IcmpMessageTypeAndCode.ConversionFailedUnsupportedTransportProtocol) if (icmpLayer.MessageTypeAndCode == IcmpMessageTypeAndCode.ConversionFailedUnsupportedTransportProtocol)
icmpIpV4PayloadLayers = new[] icmpIpV4PayloadLayers = new[]
{ {
random.NextPayloadLayer( random.NextPayloadLayer(
IcmpConversionFailedDatagram.OriginalDatagramLengthForUnsupportedTransportProtocol - icmpIpV4Layer.Length) IcmpConversionFailedDatagram.OriginalDatagramLengthForUnsupportedTransportProtocol -
}; icmpIpV4Layer.Length)
};
else else
{ {
switch (icmpIpV4Layer.Protocol) switch (icmpIpV4Layer.Protocol)
...@@ -159,19 +160,19 @@ namespace PcapDotNet.Packets.Test ...@@ -159,19 +160,19 @@ namespace PcapDotNet.Packets.Test
switch (icmpLayer.MessageType) switch (icmpLayer.MessageType)
{ {
// case IcmpMessageType.DestinationUnreachable: // case IcmpMessageType.DestinationUnreachable:
// case IcmpMessageType.TimeExceeded: // case IcmpMessageType.TimeExceeded:
case IcmpMessageType.ParameterProblem: case IcmpMessageType.ParameterProblem:
((IcmpParameterProblemLayer)icmpLayer).Pointer %= (byte)icmpPayloadLength; ((IcmpParameterProblemLayer)icmpLayer).Pointer %= (byte)icmpPayloadLength;
break; break;
// case IcmpMessageType.SourceQuench: // case IcmpMessageType.SourceQuench:
// case IcmpMessageType.Redirect: // case IcmpMessageType.Redirect:
case IcmpMessageType.SecurityFailures: case IcmpMessageType.SecurityFailures:
((IcmpSecurityFailuresLayer)icmpLayer).Pointer %= (ushort)icmpPayloadLength; ((IcmpSecurityFailuresLayer)icmpLayer).Pointer %= (ushort)icmpPayloadLength;
// icmpIpV4Layer = random.NextIpV4Layer(); // icmpIpV4Layer = random.NextIpV4Layer();
// icmpIpV4PayloadLayers = new[] {random.NextPayloadLayer(IcmpIpV4HeaderPlus64BitsPayloadDatagram.OriginalDatagramPayloadLength)}; // icmpIpV4PayloadLayers = new[] {random.NextPayloadLayer(IcmpIpV4HeaderPlus64BitsPayloadDatagram.OriginalDatagramPayloadLength)};
break; break;
// case IcmpMessageType.ConversionFailed: // case IcmpMessageType.ConversionFailed:
} }
PacketBuilder packetBuilder; PacketBuilder packetBuilder;
...@@ -181,9 +182,25 @@ namespace PcapDotNet.Packets.Test ...@@ -181,9 +182,25 @@ namespace PcapDotNet.Packets.Test
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, icmpLayer); packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, icmpLayer);
Packet packet = packetBuilder.Build(DateTime.Now); Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid, "IsValid"); 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 // Ethernet
ethernetLayer.EtherType = EthernetType.IpV4; ethernetLayer.EtherType = EthernetType.IpV4;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer"); Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
...@@ -198,51 +215,55 @@ namespace PcapDotNet.Packets.Test ...@@ -198,51 +215,55 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(ipV4Layer.Length + icmpLayer.Length + icmpPayloadLength, Assert.AreEqual(ipV4Layer.Length + icmpLayer.Length + icmpPayloadLength,
packet.Ethernet.IpV4.TotalLength); packet.Ethernet.IpV4.TotalLength);
Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.IpV4.Version); Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.IpV4.Version);
// ICMP // ICMP
IcmpLayer actualIcmpLayer = (IcmpLayer)packet.Ethernet.IpV4.Icmp.ExtractLayer(); IcmpDatagram actualIcmp = packet.Ethernet.IpV4.Icmp;
IcmpLayer actualIcmpLayer = (IcmpLayer)actualIcmp.ExtractLayer();
icmpLayer.Checksum = actualIcmpLayer.Checksum; icmpLayer.Checksum = actualIcmpLayer.Checksum;
Assert.AreEqual(icmpLayer, actualIcmpLayer); Assert.AreEqual(icmpLayer, actualIcmpLayer);
Assert.IsTrue(packet.Ethernet.IpV4.Icmp.IsChecksumCorrect); Assert.AreNotEqual(random.NextIcmpLayer(), actualIcmpLayer);
Assert.AreEqual(icmpLayer.MessageType, packet.Ethernet.IpV4.Icmp.MessageType); Assert.IsTrue(actualIcmp.IsChecksumCorrect);
Assert.AreEqual(icmpLayer.CodeValue, packet.Ethernet.IpV4.Icmp.Code); Assert.AreEqual(icmpLayer.MessageType, actualIcmp.MessageType);
Assert.AreEqual(icmpLayer.CodeValue, actualIcmp.Code);
// switch (packet.Ethernet.IpV4.Icmp.MessageType) Assert.AreEqual(icmpLayer.MessageTypeAndCode, actualIcmp.MessageTypeAndCode);
// { Assert.AreEqual(packet.Length - ethernetLayer.Length - ipV4Layer.Length - IcmpDatagram.HeaderLength, actualIcmp.Payload.Length);
// case IcmpMessageType.DestinationUnreachable: Assert.IsNotNull(icmpLayer.ToString());
//// Assert.AreEqual(icmpIpV4Layer, packet.Ethernet.IpV4.Icmp.DestinationUncreachable.IpV4.ExtractLayer());
// switch (packet.Ethernet.IpV4.Icmp.MessageType)
// case IcmpMessageType.TimeExceeded: {
// case IcmpMessageType.ParameterProblem: case IcmpMessageType.DestinationUnreachable:
// case IcmpMessageType.SourceQuench: case IcmpMessageType.RouterSolicitation:
// case IcmpMessageType.Redirect: case IcmpMessageType.SourceQuench:
// case IcmpMessageType.ConversionFailed: case IcmpMessageType.TimeExceeded:
// isIpV4Payload = true; Assert.AreEqual<uint>(0, actualIcmp.Variable);
// break; break;
//
// case IcmpMessageType.Echo: case IcmpMessageType.ParameterProblem:
// case IcmpMessageType.EchoReply: case IcmpMessageType.Redirect:
// case IcmpMessageType.Timestamp: case IcmpMessageType.ConversionFailed:
// case IcmpMessageType.TimestampReply: case IcmpMessageType.Echo:
// case IcmpMessageType.InformationRequest: case IcmpMessageType.EchoReply:
// case IcmpMessageType.InformationReply: case IcmpMessageType.Timestamp:
// case IcmpMessageType.RouterAdvertisement: case IcmpMessageType.TimestampReply:
// case IcmpMessageType.RouterSolicitation: case IcmpMessageType.InformationRequest:
//// packet.Ethernet.IpV4.Icmp.RouterSolicitation case IcmpMessageType.InformationReply:
// case IcmpMessageType.AddressMaskRequest: case IcmpMessageType.RouterAdvertisement:
// case IcmpMessageType.AddressMaskReply: case IcmpMessageType.AddressMaskRequest:
// case IcmpMessageType.Traceroute: case IcmpMessageType.AddressMaskReply:
// case IcmpMessageType.DomainNameRequest: break;
// case IcmpMessageType.SecurityFailures: case IcmpMessageType.Traceroute:
// isIpV4Payload = false; Assert.AreEqual(((IcmpTracerouteLayer)icmpLayer).OutboundHopCount == 0xFFFF, ((IcmpTracerouteDatagram)actualIcmp).IsOutbound);
// break; break;
// case IcmpMessageType.DomainNameRequest:
// case IcmpMessageType.DomainNameReply: case IcmpMessageType.SecurityFailures:
// break;
// default: break;
// throw new InvalidOperationException("Invalid icmpMessageType " + packet.Ethernet.IpV4.Icmp.MessageType);
// case IcmpMessageType.DomainNameReply:
// } default:
throw new InvalidOperationException("Invalid icmpMessageType " + packet.Ethernet.IpV4.Icmp.MessageType);
}
} }
} }
} }
......
namespace PcapDotNet.Packets.Icmp 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 public class IcmpAddressMaskReplyDatagram : IcmpAddressMaskRequestDatagram
{ {
internal IcmpAddressMaskReplyDatagram(byte[] buffer, int offset, int length) internal IcmpAddressMaskReplyDatagram(byte[] buffer, int offset, int length)
......
...@@ -11,11 +11,11 @@ namespace PcapDotNet.Packets.Icmp ...@@ -11,11 +11,11 @@ namespace PcapDotNet.Packets.Icmp
get { return IcmpMessageType.AddressMaskRequest; } get { return IcmpMessageType.AddressMaskRequest; }
} }
public override int Length protected override int PayloadLength
{ {
get get
{ {
return base.Length + IcmpAddressMaskRequestDatagram.PayloadLength; return IcmpAddressMaskRequestDatagram.PayloadLength;
} }
} }
......
...@@ -208,6 +208,8 @@ namespace PcapDotNet.Packets.Icmp ...@@ -208,6 +208,8 @@ namespace PcapDotNet.Packets.Icmp
return new IcmpSecurityFailuresDatagram(buffer, offset, length); return new IcmpSecurityFailuresDatagram(buffer, offset, length);
case IcmpMessageType.RouterSolicitation: case IcmpMessageType.RouterSolicitation:
return new IcmpRouterSolicitationDatagram(buffer, offset, length);
case IcmpMessageType.DomainNameReply: // Domain Name Reply is unsupported case IcmpMessageType.DomainNameReply: // Domain Name Reply is unsupported
default: default:
return new IcmpUnknownDatagram(buffer, offset, length); return new IcmpUnknownDatagram(buffer, offset, length);
......
...@@ -24,9 +24,14 @@ namespace PcapDotNet.Packets.Icmp ...@@ -24,9 +24,14 @@ namespace PcapDotNet.Packets.Icmp
get { return 0; } 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) protected override sealed void Write(byte[] buffer, int offset)
......
...@@ -121,7 +121,7 @@ namespace PcapDotNet.Packets.Icmp ...@@ -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; return numEntries * DefaultAddressEntrySize * IpV4Address.SizeOf;
} }
......
...@@ -24,11 +24,11 @@ namespace PcapDotNet.Packets.Icmp ...@@ -24,11 +24,11 @@ namespace PcapDotNet.Packets.Icmp
} }
} }
public override int Length protected override int PayloadLength
{ {
get 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 namespace PcapDotNet.Packets.Icmp
{ {
/// <summary> /// <summary>
...@@ -30,6 +32,5 @@ namespace PcapDotNet.Packets.Icmp ...@@ -30,6 +32,5 @@ namespace PcapDotNet.Packets.Icmp
Checksum = Checksum Checksum = Checksum
}; };
} }
} }
} }
\ No newline at end of file
...@@ -12,11 +12,11 @@ namespace PcapDotNet.Packets.Icmp ...@@ -12,11 +12,11 @@ namespace PcapDotNet.Packets.Icmp
get { return IcmpMessageType.Timestamp; } get { return IcmpMessageType.Timestamp; }
} }
public override int Length protected override int PayloadLength
{ {
get get
{ {
return base.Length + IcmpTimestampDatagram.PayloadLength; return IcmpTimestampDatagram.PayloadLength;
} }
} }
......
namespace PcapDotNet.Packets.Icmp 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 public class IcmpTimestampReplyDatagram : IcmpTimestampDatagram
{ {
internal IcmpTimestampReplyDatagram(byte[] buffer, int offset, int length) internal IcmpTimestampReplyDatagram(byte[] buffer, int offset, int length)
......
...@@ -21,11 +21,11 @@ namespace PcapDotNet.Packets.Icmp ...@@ -21,11 +21,11 @@ namespace PcapDotNet.Packets.Icmp
get { return IcmpMessageType.Traceroute; } get { return IcmpMessageType.Traceroute; }
} }
public override int Length protected override int PayloadLength
{ {
get get
{ {
return base.Length + IcmpTracerouteDatagram.PayloadLength; return IcmpTracerouteDatagram.PayloadLength;
} }
} }
......
...@@ -19,14 +19,9 @@ namespace PcapDotNet.Packets.Icmp ...@@ -19,14 +19,9 @@ namespace PcapDotNet.Packets.Icmp
}; };
} }
protected override byte MinCodeValue protected override bool CalculateIsValid()
{ {
get { return byte.MinValue; } return false;
}
protected override byte MaxCodeValue
{
get { return byte.MaxValue; }
} }
} }
} }
\ No newline at end of file
...@@ -15,6 +15,22 @@ namespace PcapDotNet.Packets.Icmp ...@@ -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 protected override uint Value
{ {
get { return LayerValue; } get { return LayerValue; }
......
...@@ -99,6 +99,7 @@ ...@@ -99,6 +99,7 @@
<Compile Include="Icmp\IcmpRedirectLayer.cs" /> <Compile Include="Icmp\IcmpRedirectLayer.cs" />
<Compile Include="Icmp\IcmpRouterAdvertisementEntry.cs" /> <Compile Include="Icmp\IcmpRouterAdvertisementEntry.cs" />
<Compile Include="Icmp\IcmpRouterAdvertisementLayer.cs" /> <Compile Include="Icmp\IcmpRouterAdvertisementLayer.cs" />
<Compile Include="Icmp\IcmpRouterSolicitationDatagram.cs" />
<Compile Include="Icmp\IcmpRouterSolicitationLayer.cs" /> <Compile Include="Icmp\IcmpRouterSolicitationLayer.cs" />
<Compile Include="Icmp\IcmpSecurityFailuresLayer.cs" /> <Compile Include="Icmp\IcmpSecurityFailuresLayer.cs" />
<Compile Include="Icmp\IcmpSourceQuenchDatagram.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