Commit 457e35b8 authored by Brickner_cp's avatar Brickner_cp

ICMP

parent 7bf4249c
......@@ -90,28 +90,88 @@ namespace PcapDotNet.Packets.Test
for (int i = 0; i != 1000; ++i)
{
IpV4Layer icmpIpV4Layer = new IpV4Layer
{
TypeOfService = random.NextByte(),
Identification = random.NextUShort(),
Fragmentation = random.NextIpV4Fragmentation(),
Ttl = random.NextByte(),
Protocol = random.NextEnum<IpV4Protocol>(),
Source = random.NextIpV4Address(),
Destination = random.NextIpV4Address(),
Options = random.NextIpV4Options(),
};
IcmpLayer icmpLayer = random.NextIcmpLayer();
PayloadLayer icmpIpV4PayloadLayer = new PayloadLayer
{
Data = random.NextDatagram(random.Next(200))
};
bool isIpV4Payload;
switch (icmpLayer.MessageType)
{
case IcmpMessageType.DestinationUnreachable:
case IcmpMessageType.TimeExceeded:
case IcmpMessageType.ParameterProblem:
case IcmpMessageType.SourceQuench:
case IcmpMessageType.Redirect:
case IcmpMessageType.ConversionFailed:
isIpV4Payload = true;
break;
IcmpLayer icmpLayer = random.NextIcmpLayer();
case IcmpMessageType.Echo:
case IcmpMessageType.EchoReply:
case IcmpMessageType.Timestamp:
case IcmpMessageType.TimestampReply:
case IcmpMessageType.InformationRequest:
case IcmpMessageType.InformationReply:
case IcmpMessageType.RouterAdvertisement:
case IcmpMessageType.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 " + icmpLayer.MessageType);
}
PacketBuilder2 packetBuilder2;
IpV4Layer icmpIpV4Layer = null;
PayloadLayer icmpIpV4PayloadLayer = null;
if (isIpV4Payload)
{
icmpIpV4Layer = new IpV4Layer
{
TypeOfService = random.NextByte(),
Identification = random.NextUShort(),
Fragmentation = random.NextIpV4Fragmentation(),
Ttl = random.NextByte(),
Protocol = random.NextEnum<IpV4Protocol>(),
Source = random.NextIpV4Address(),
Destination = random.NextIpV4Address(),
Options = random.NextIpV4Options(),
};
Packet packet = new PacketBuilder2(ethernetLayer, ipV4Layer, icmpLayer, icmpIpV4Layer, icmpIpV4PayloadLayer).Build(DateTime.Now);
icmpIpV4PayloadLayer = new PayloadLayer
{
Data = random.NextDatagram(random.Next(200))
};
packetBuilder2 = new PacketBuilder2(ethernetLayer, ipV4Layer, icmpLayer, icmpIpV4Layer, icmpIpV4PayloadLayer);
}
else
packetBuilder2 = new PacketBuilder2(ethernetLayer, ipV4Layer, icmpLayer);
Packet packet = packetBuilder2.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid, "IsValid");
// Ethernet
ethernetLayer.EtherType = EthernetType.IpV4;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
// IPv4
ipV4Layer.Protocol = IpV4Protocol.InternetControlMessageProtocol;
Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer());
Assert.AreEqual(ipV4Layer.Length, packet.Ethernet.IpV4.HeaderLength);
Assert.IsTrue(packet.Ethernet.IpV4.IsHeaderChecksumCorrect);
Assert.AreEqual(ipV4Layer.Length + icmpLayer.Length + (isIpV4Payload ? icmpIpV4Layer.Length + icmpIpV4PayloadLayer.Length : 0),
packet.Ethernet.IpV4.TotalLength);
Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.IpV4.Version);
// ICMP
IcmpLayer actualIcmpLayer = (IcmpLayer)packet.Ethernet.IpV4.Icmp.ExtractLayer();
Assert.AreEqual(icmpLayer, actualIcmpLayer);
Assert.IsTrue(packet.Ethernet.IpV4.Icmp.IsChecksumCorrect);
}
}
}
......
......@@ -476,12 +476,7 @@ namespace PcapDotNet.Packets.TestUtils
public static IcmpLayer NextIcmpLayer(this Random random)
{
IcmpMessageType icmpMessageType = random.NextValue(new[]
{
IcmpMessageType.DestinationUnreachable,
IcmpMessageType.TimeExceeded
});
//random.NextEnum<IcmpMessageType>();
IcmpMessageType icmpMessageType = random.NextEnum<IcmpMessageType>(IcmpMessageType.DomainNameReply);
switch (icmpMessageType)
{
......@@ -500,7 +495,7 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.ParameterProblem:
return new IcmpParameterProblemLayer
{
Pointer = random.NextUShort()
Pointer = random.NextByte()
};
case IcmpMessageType.SourceQuench:
......
......@@ -76,6 +76,14 @@ namespace PcapDotNet.Packets
}
}
public virtual ILayer ExtractLayer()
{
return new PayloadLayer
{
Data = this
};
}
/// <summary>
/// Iterate through all the bytes in the datagram.
/// </summary>
......
......@@ -88,6 +88,16 @@ namespace PcapDotNet.Packets.Ethernet
}
}
public override ILayer ExtractLayer()
{
return new EthernetLayer()
{
Source = Source,
Destination = Destination,
EtherType = EtherType,
};
}
/// <summary>
/// The Ethernet payload as an IPv4 datagram.
/// </summary>
......
......@@ -40,7 +40,7 @@ namespace PcapDotNet.Packets.Icmp
internal static void WriteHeaderAdditional(byte[] buffer, int offset, IpV4Address addressMask)
{
buffer.Write(offset + Offset.AddressMask, addressMask, Endianity.Big);
buffer.Write(offset, addressMask, Endianity.Big);
}
}
}
\ No newline at end of file
using System;
using System.Linq;
namespace PcapDotNet.Packets.Icmp
{
......@@ -75,9 +76,157 @@ namespace PcapDotNet.Packets.Icmp
}
}
public override ILayer ExtractLayer()
{
switch (MessageType)
{
case IcmpMessageType.DestinationUnreachable:
return new IcmpDestinationUnreachableLayer
{
Code = (IcmpCodeDestinationUnrechable)Code
};
case IcmpMessageType.TimeExceeded:
return new IcmpTimeExceededLayer
{
Code = (IcmpCodeTimeExceeded)Code
};
case IcmpMessageType.ParameterProblem:
return new IcmpParameterProblemLayer
{
Pointer = ParameterProblem.Pointer
};
case IcmpMessageType.SourceQuench:
return new IcmpSourceQuenchLayer();
case IcmpMessageType.Redirect:
return new IcmpRedirectLayer
{
Code = (IcmpCodeRedirect)Code,
GatewayInternetAddress = Redirect.GatewayInternetAddress
};
case IcmpMessageType.Echo:
return new IcmpEchoLayer
{
Identifier = Echo.Identifier,
SequenceNumber = Echo.SequenceNumber
};
case IcmpMessageType.EchoReply:
return new IcmpEchoReplyLayer
{
Identifier = EchoReply.Identifier,
SequenceNumber = EchoReply.SequenceNumber
};
case IcmpMessageType.Timestamp:
return new IcmpTimestampLayer
{
Identifier = Timestamp.Identifier,
SequenceNumber = Timestamp.SequenceNumber,
OriginateTimestamp = Timestamp.OriginateTimestamp,
ReceiveTimestamp = Timestamp.ReceiveTimestamp,
TransmitTimestamp = Timestamp.TransmitTimestamp
};
case IcmpMessageType.TimestampReply:
return new IcmpTimestampReplyLayer
{
Identifier = TimestampReply.Identifier,
SequenceNumber = TimestampReply.SequenceNumber,
OriginateTimestamp = TimestampReply.OriginateTimestamp,
ReceiveTimestamp = TimestampReply.ReceiveTimestamp,
TransmitTimestamp = TimestampReply.TransmitTimestamp,
};
case IcmpMessageType.InformationRequest:
return new IcmpInformationRequestLayer
{
Identifier = InformationRequest.Identifier,
SequenceNumber = InformationRequest.SequenceNumber
};
case IcmpMessageType.InformationReply:
return new IcmpInformationReplyLayer
{
Identifier = InformationReply.Identifier,
SequenceNumber = InformationReply.SequenceNumber
};
case IcmpMessageType.RouterAdvertisement:
return new IcmpRouterAdvertisementLayer
{
Lifetime = RouterAdvertisement.Lifetime,
Entries = RouterAdvertisement.Entries.ToList()
};
case IcmpMessageType.RouterSolicitation:
return new IcmpRouterSolicitationLayer();
case IcmpMessageType.AddressMaskRequest:
return new IcmpAddressMaskRequestLayer
{
Identifier = AddressMaskRequest.Identifier,
SequenceNumber = AddressMaskRequest.SequenceNumber,
AddressMask = AddressMaskRequest.AddressMask
};
case IcmpMessageType.AddressMaskReply:
return new IcmpAddressMaskReplyLayer
{
Identifier = AddressMaskReply.Identifier,
SequenceNumber = AddressMaskReply.SequenceNumber,
AddressMask = AddressMaskReply.AddressMask
};
case IcmpMessageType.Traceroute:
return new IcmpTracerouteLayer
{
Code = (IcmpCodeTraceroute)Code,
Identification = Traceroute.Identification,
OutboundHopCount = Traceroute.OutboundHopCount,
ReturnHopCount = Traceroute.ReturnHopCount,
OutputLinkSpeed = Traceroute.OutputLinkSpeed,
OutputLinkMtu = Traceroute.OutputLinkMtu
};
case IcmpMessageType.ConversionFailed:
return new IcmpConversionFailedLayer
{
Code = (IcmpCodeConversionFailed)Code,
Pointer = ConversionFailed.Pointer
};
case IcmpMessageType.DomainNameRequest:
return new IcmpDomainNameRequestLayer
{
Identifier = DomainNameRequest.Identifier,
SequenceNumber = DomainNameRequest.SequenceNumber
};
case IcmpMessageType.DomainNameReply:
throw new NotSupportedException("Message Type " + MessageType + " is not supported");
case IcmpMessageType.SecurityFailures:
return new IcmpSecurityFailuresLayer
{
Code = (IcmpCodeSecurityFailures)Code,
Pointer = SecurityFailures.Pointer
};
default:
throw new InvalidOperationException("Invalid icmpMessageType " + MessageType);
}
}
public Datagram Payload
{
get { return new Datagram(Buffer, StartOffset + HeaderLength, Length - HeaderLength); }
get { return Typed; }
}
public IcmpIpV4HeaderPlus64BitsPayloadDatagram DestinationUncreachable
......
......@@ -23,6 +23,18 @@ namespace PcapDotNet.Packets.Icmp
get {return _routerAddressPreference; }
}
public bool Equals(IcmpRouterAdvertisementEntry other)
{
return other != null &&
RouterAddress == other.RouterAddress &&
RouterAddressPreference == other.RouterAddressPreference;
}
public override bool Equals(object obj)
{
return Equals(obj as IcmpRouterAdvertisementEntry);
}
private readonly IpV4Address _routerAddress;
private readonly int _routerAddressPreference;
}
......
......@@ -50,5 +50,19 @@ namespace PcapDotNet.Packets
{
IcmpTracerouteDatagram.WriteHeaderAdditional(buffer, offset, OutboundHopCount, ReturnHopCount, OutputLinkSpeed, OutputLinkMtu);
}
public bool Equals(IcmpTracerouteLayer other)
{
return other != null &&
OutboundHopCount == other.OutboundHopCount &&
ReturnHopCount == other.ReturnHopCount &&
OutputLinkSpeed == other.OutputLinkSpeed &&
OutputLinkMtu == other.OutputLinkMtu;
}
public override sealed bool Equals(IcmpLayer other)
{
return base.Equals(other) && Equals(other as IcmpTracerouteLayer);
}
}
}
\ No newline at end of file
......@@ -206,6 +206,21 @@ namespace PcapDotNet.Packets.IpV4
}
}
public override ILayer ExtractLayer()
{
return new IpV4Layer
{
TypeOfService = TypeOfService,
Identification = Identification,
Fragmentation = Fragmentation,
Ttl = Ttl,
Protocol = Protocol,
Source = Source,
Destination = Destination,
Options = Options,
};
}
/// <summary>
/// The payload of the datagram.
/// </summary>
......
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