Commit 1e1408a0 authored by Brickner_cp's avatar Brickner_cp

ICMP

parent 457e35b8
...@@ -19,5 +19,10 @@ namespace PcapDotNet.Base ...@@ -19,5 +19,10 @@ namespace PcapDotNet.Base
{ {
return TimeSpan.FromTicks((long)(timeSpan.Ticks / value)); return TimeSpan.FromTicks((long)(timeSpan.Ticks / value));
} }
public static TimeSpan Multiply(this TimeSpan timeSpan, double value)
{
return TimeSpan.FromTicks((long)(timeSpan.Ticks * value));
}
} }
} }
\ No newline at end of file
...@@ -57,34 +57,14 @@ namespace PcapDotNet.Packets.Test ...@@ -57,34 +57,14 @@ namespace PcapDotNet.Packets.Test
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
MacAddress ethernetSource = random.NextMacAddress(); MacAddress ethernetSource = random.NextMacAddress();
EthernetType ethernetType = random.NextEnum<EthernetType>(); EthernetLayer ethernetLayer = new EthernetLayer
ArpOperation arpOperation = random.NextEnum<ArpOperation>(); {
byte hardwareAddressLength = random.NextByte(); Source = ethernetSource,
byte protocolAddressLength = random.NextByte(); };
byte[] arpSenderHardwareAddress = random.NextBytes(hardwareAddressLength);
byte[] arpSenderProtocolAddress = random.NextBytes(protocolAddressLength);
byte[] arpTargetHardwareAddress = random.NextBytes(hardwareAddressLength);
byte[] arpTargetProtocolAddress = random.NextBytes(protocolAddressLength);
Packet packet = new PacketBuilder2(new EthernetLayer ArpLayer arpLayer = random.NextArpLayer();
{
Source = ethernetSource, Packet packet = new PacketBuilder2(ethernetLayer, arpLayer).Build(DateTime.Now);
},
new ArpLayer
{
ProtocolType = ethernetType,
Operation=arpOperation,
SenderHardwareAddress = arpSenderHardwareAddress,
SenderProtocolAddress = arpSenderProtocolAddress,
TargetHardwareAddress = arpTargetHardwareAddress,
TargetProtocolAddress = arpTargetProtocolAddress
})
.Build(DateTime.Now);
// Packet packet = PacketBuilder.EthernetArp(DateTime.Now,
// ethernetSource,
// ethernetType, arpOperation,
// arpSenderHardwareAddress, arpSenderProtocolAddress,
// arpTargetHardwareAddress, arpTargetProtocolAddress);
Assert.IsTrue(packet.IsValid, "IsValid"); Assert.IsTrue(packet.IsValid, "IsValid");
...@@ -96,16 +76,9 @@ namespace PcapDotNet.Packets.Test ...@@ -96,16 +76,9 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(EthernetType.Arp, packet.Ethernet.EtherType, "Ethernet EtherType"); Assert.AreEqual(EthernetType.Arp, packet.Ethernet.EtherType, "Ethernet EtherType");
// Arp // Arp
Assert.AreEqual(ArpDatagram.HeaderBaseLength + 2 * hardwareAddressLength + 2 * protocolAddressLength, packet.Ethernet.Arp.Length, "Arp length"); Assert.AreEqual(ArpDatagram.HeaderBaseLength + 2 * arpLayer.SenderHardwareAddress.Count + 2 * arpLayer.SenderProtocolAddress.Count, packet.Ethernet.Arp.Length, "Arp length");
Assert.AreEqual(ArpHardwareType.Ethernet, packet.Ethernet.Arp.HardwareType, "Arp hardware type"); Assert.AreEqual(ArpHardwareType.Ethernet, packet.Ethernet.Arp.HardwareType, "Arp hardware type");
Assert.AreEqual(ethernetType, packet.Ethernet.Arp.ProtocolType, "Arp protocol type"); Assert.AreEqual(arpLayer, packet.Ethernet.Arp.ExtractLayer(), "ARP Layer");
Assert.AreEqual(hardwareAddressLength, packet.Ethernet.Arp.HardwareLength, "Arp hardware length");
Assert.AreEqual(protocolAddressLength, packet.Ethernet.Arp.ProtocolLength, "Arp protocol length");
Assert.AreEqual(arpOperation, packet.Ethernet.Arp.Operation, "Arp operation");
MoreAssert.AreSequenceEqual(arpSenderHardwareAddress, packet.Ethernet.Arp.SenderHardwareAddress, "Arp SenderHardwareAddress");
MoreAssert.AreSequenceEqual(arpSenderProtocolAddress, packet.Ethernet.Arp.SenderProtocolAddress, "Arp SenderProtocolAddress");
MoreAssert.AreSequenceEqual(arpTargetHardwareAddress, packet.Ethernet.Arp.TargetHardwareAddress, "Arp TargetHardwareAddress");
MoreAssert.AreSequenceEqual(arpTargetProtocolAddress, packet.Ethernet.Arp.TargetProtocolAddress, "Arp TargetProtocolAddress");
} }
} }
......
...@@ -66,33 +66,20 @@ namespace PcapDotNet.Packets.Test ...@@ -66,33 +66,20 @@ namespace PcapDotNet.Packets.Test
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
MacAddress ethernetSource = random.NextMacAddress(); EthernetLayer ethernetLayer = random.NextEthernetLayer();
MacAddress ethernetDestination = random.NextMacAddress();
EthernetType ethernetType = random.NextEnum(EthernetType.None);
int ethernetPayloadLength = random.Next(1500); int ethernetPayloadLength = random.Next(1500);
Datagram ethernetPayload = random.NextDatagram(ethernetPayloadLength); PayloadLayer payloadLayer = new PayloadLayer
{
Packet packet = Data = random.NextDatagram(ethernetPayloadLength),
new PacketBuilder2(new EthernetLayer };
{ Packet packet = new PacketBuilder2(ethernetLayer, payloadLayer).Build(DateTime.Now);
Source = ethernetSource,
Destination = ethernetDestination,
EtherType = ethernetType
},
new PayloadLayer
{
Data = ethernetPayload
})
.Build(DateTime.Now);
// Ethernet // Ethernet
Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLength, packet.Ethernet.PayloadLength, "PayloadLength"); Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLength, packet.Ethernet.PayloadLength, "PayloadLength");
Assert.AreEqual(ethernetSource, packet.Ethernet.Source, "Ethernet Source"); Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
Assert.AreNotEqual(2, packet.Ethernet.Source, "Ethernet Source"); Assert.AreNotEqual(2, packet.Ethernet.Source, "Ethernet Source");
Assert.AreEqual(ethernetDestination, packet.Ethernet.Destination, "Ethernet Destination");
Assert.AreEqual(ethernetType, packet.Ethernet.EtherType, "Ethernet Type");
Assert.AreEqual(ethernetPayload, packet.Ethernet.Payload); Assert.AreEqual(payloadLayer.Data, packet.Ethernet.Payload);
} }
} }
} }
......
...@@ -76,18 +76,7 @@ namespace PcapDotNet.Packets.Test ...@@ -76,18 +76,7 @@ namespace PcapDotNet.Packets.Test
Random random = new Random(); Random random = new Random();
IpV4Layer ipV4Layer = new IpV4Layer IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
{
TypeOfService = random.NextByte(),
Identification = random.NextUShort(),
Ttl = random.NextByte(),
Fragmentation = random.NextIpV4Fragmentation(),
Source = random.NextIpV4Address(),
Destination = random.NextIpV4Address(),
Options = random.NextIpV4Options()
};
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
IcmpLayer icmpLayer = random.NextIcmpLayer(); IcmpLayer icmpLayer = random.NextIcmpLayer();
...@@ -129,22 +118,9 @@ namespace PcapDotNet.Packets.Test ...@@ -129,22 +118,9 @@ namespace PcapDotNet.Packets.Test
PayloadLayer icmpIpV4PayloadLayer = null; PayloadLayer icmpIpV4PayloadLayer = null;
if (isIpV4Payload) if (isIpV4Payload)
{ {
icmpIpV4Layer = new IpV4Layer icmpIpV4Layer = random.NextIpV4Layer();
{
TypeOfService = random.NextByte(), icmpIpV4PayloadLayer = random.NextPayloadLayer(random.Next(200));
Identification = random.NextUShort(),
Fragmentation = random.NextIpV4Fragmentation(),
Ttl = random.NextByte(),
Protocol = random.NextEnum<IpV4Protocol>(),
Source = random.NextIpV4Address(),
Destination = random.NextIpV4Address(),
Options = random.NextIpV4Options(),
};
icmpIpV4PayloadLayer = new PayloadLayer
{
Data = random.NextDatagram(random.Next(200))
};
packetBuilder2 = new PacketBuilder2(ethernetLayer, ipV4Layer, icmpLayer, icmpIpV4Layer, icmpIpV4PayloadLayer); packetBuilder2 = new PacketBuilder2(ethernetLayer, ipV4Layer, icmpLayer, icmpIpV4Layer, icmpIpV4PayloadLayer);
} }
......
...@@ -104,96 +104,56 @@ namespace PcapDotNet.Packets.Test ...@@ -104,96 +104,56 @@ namespace PcapDotNet.Packets.Test
MacAddress ethernetDestination = new MacAddress("A0:A1:A2:A3:A4:A5"); MacAddress ethernetDestination = new MacAddress("A0:A1:A2:A3:A4:A5");
const EthernetType ethernetType = EthernetType.IpV4; const EthernetType ethernetType = EthernetType.IpV4;
EthernetLayer ethernetLayer = new EthernetLayer
{
Source = ethernetSource,
Destination = ethernetDestination,
EtherType = ethernetType
};
Random random = new Random(); Random random = new Random();
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
byte ipV4TypeOfService = random.NextByte(); IpV4Layer ipV4Layer = random.NextIpV4Layer();
ushort ipV4Identification = random.NextUShort();
byte ipV4Ttl = random.NextByte(); PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(0, 50 * 1024));
IpV4FragmentationOptions ipV4FragmentationOptions = random.NextEnum<IpV4FragmentationOptions>();
ushort ipV4FragmentationOffset = (ushort)(random.NextUShort(ushort.MaxValue / 8) * 8); Packet packet = new PacketBuilder2(ethernetLayer, ipV4Layer, payloadLayer).Build(DateTime.Now);
IpV4Fragmentation ipV4Fragmentation = new IpV4Fragmentation(ipV4FragmentationOptions, ipV4FragmentationOffset);
IpV4Protocol ipV4Protocol = random.NextEnum<IpV4Protocol>(); Assert.IsTrue(ipV4Layer.Protocol == IpV4Protocol.Udp ||
IpV4Address ipV4Source = new IpV4Address(random.NextUInt()); ipV4Layer.Protocol == IpV4Protocol.Tcp ||
IpV4Address ipV4Destination = new IpV4Address(random.NextUInt()); ipV4Layer.Protocol == IpV4Protocol.InternetGroupManagementProtocol ||
IpV4Options ipV4Options = random.NextIpV4Options(); ipV4Layer.Protocol == IpV4Protocol.InternetControlMessageProtocol ||
byte[] ipV4PayloadBuffer = new byte[random.Next(0, 50 * 1024)];
random.NextBytes(ipV4PayloadBuffer);
Datagram ipV4Payload = new Datagram(ipV4PayloadBuffer);
Packet packet =
new PacketBuilder2(new EthernetLayer
{
Source = ethernetSource,
Destination = ethernetDestination,
},
new IpV4Layer
{
TypeOfService = ipV4TypeOfService,
Identification = ipV4Identification,
Fragmentation = ipV4Fragmentation,
Ttl = ipV4Ttl,
Protocol = ipV4Protocol,
Source = ipV4Source,
Destination = ipV4Destination,
Options = ipV4Options,
},
new PayloadLayer
{
Data = ipV4Payload
}
).Build(DateTime.Now);
// Packet packet = PacketBuilder.EthernetIpV4(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, ipV4Protocol,
// ipV4Source, ipV4Destination, ipV4Options,
// ipV4Payload);
Assert.IsTrue(ipV4Protocol == IpV4Protocol.Udp ||
ipV4Protocol == IpV4Protocol.Tcp ||
ipV4Protocol == IpV4Protocol.InternetGroupManagementProtocol ||
packet.IsValid, "IsValid"); packet.IsValid, "IsValid");
// Ethernet // Ethernet
Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLength, packet.Ethernet.PayloadLength, "PayloadLength"); Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLength, packet.Ethernet.PayloadLength, "PayloadLength");
Assert.AreEqual(ethernetSource, packet.Ethernet.Source, "Ethernet Source"); Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
Assert.AreEqual(ethernetDestination, packet.Ethernet.Destination, "Ethernet Destination");
Assert.AreEqual(ethernetType, packet.Ethernet.EtherType, "Ethernet Type");
// IpV4 // IpV4
Assert.AreEqual(IpV4Datagram.HeaderMinimumLength + ipV4Options.BytesLength, packet.Ethernet.IpV4.HeaderLength, "IP HeaderLength"); Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer(), "IP Layer");
Assert.AreEqual(ipV4TypeOfService, packet.Ethernet.IpV4.TypeOfService, "IP TypeOfService"); Assert.AreEqual(IpV4Datagram.HeaderMinimumLength + ipV4Layer.Options.BytesLength, packet.Ethernet.IpV4.HeaderLength, "IP HeaderLength");
Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLength, packet.Ethernet.IpV4.TotalLength, "IP TotalLength"); Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLength, packet.Ethernet.IpV4.TotalLength, "IP TotalLength");
Assert.AreEqual(ipV4Identification, packet.Ethernet.IpV4.Identification, "IP Identification");
Assert.AreEqual(ipV4Fragmentation, packet.Ethernet.IpV4.Fragmentation, "IP Fragmentation");
Assert.AreNotEqual(2, packet.Ethernet.IpV4.Fragmentation, "IP Fragmentation"); Assert.AreNotEqual(2, packet.Ethernet.IpV4.Fragmentation, "IP Fragmentation");
Assert.IsTrue(ipV4Fragmentation == packet.Ethernet.IpV4.Fragmentation, "IP Fragmentation"); Assert.IsTrue(ipV4Layer.Fragmentation == packet.Ethernet.IpV4.Fragmentation, "IP Fragmentation");
Assert.IsFalse(ipV4Fragmentation != packet.Ethernet.IpV4.Fragmentation, "IP Fragmentation"); Assert.IsFalse(ipV4Layer.Fragmentation != packet.Ethernet.IpV4.Fragmentation, "IP Fragmentation");
Assert.AreEqual(ipV4Fragmentation.GetHashCode(), packet.Ethernet.IpV4.Fragmentation.GetHashCode(), "IP Fragmentation"); Assert.AreEqual(ipV4Layer.Fragmentation.GetHashCode(), packet.Ethernet.IpV4.Fragmentation.GetHashCode(), "IP Fragmentation");
Assert.AreEqual(ipV4Fragmentation.Options, packet.Ethernet.IpV4.Fragmentation.Options, "IP Fragmentation"); Assert.AreEqual(ipV4Layer.Fragmentation.Options, packet.Ethernet.IpV4.Fragmentation.Options, "IP Fragmentation");
Assert.AreEqual(ipV4Fragmentation.Offset, packet.Ethernet.IpV4.Fragmentation.Offset, "IP Fragmentation"); Assert.AreEqual(ipV4Layer.Fragmentation.Offset, packet.Ethernet.IpV4.Fragmentation.Offset, "IP Fragmentation");
if (ipV4Fragmentation.Equals(IpV4Fragmentation.None)) if (ipV4Layer.Fragmentation.Equals(IpV4Fragmentation.None))
{ {
Assert.AreEqual(IpV4FragmentationOptions.None, packet.Ethernet.IpV4.Fragmentation.Options, "IP Fragmentation"); Assert.AreEqual(IpV4FragmentationOptions.None, packet.Ethernet.IpV4.Fragmentation.Options, "IP Fragmentation");
Assert.AreEqual(0, packet.Ethernet.IpV4.Fragmentation.Offset, "IP Fragmentation"); Assert.AreEqual(0, packet.Ethernet.IpV4.Fragmentation.Offset, "IP Fragmentation");
} }
Assert.AreEqual(ipV4Ttl, packet.Ethernet.IpV4.Ttl, "IP Ttl");
Assert.AreEqual(ipV4Protocol, packet.Ethernet.IpV4.Protocol, "IP Protocol");
// Assert.AreEqual(0x9010, packet.Ethernet.IpV4.HeaderChecksum, "IP HeaderChecksum");
Assert.AreEqual(true, packet.Ethernet.IpV4.IsHeaderChecksumCorrect, "IP HeaderChecksumCorrect"); Assert.AreEqual(true, packet.Ethernet.IpV4.IsHeaderChecksumCorrect, "IP HeaderChecksumCorrect");
Assert.AreEqual(ipV4Source, packet.Ethernet.IpV4.Source, "IP Source");
Assert.AreEqual(ipV4Destination, packet.Ethernet.IpV4.Destination, "IP Destination");
Assert.AreEqual(ipV4Options, packet.Ethernet.IpV4.Options, "IP Options");
Assert.AreNotEqual(null, packet.Ethernet.IpV4.Options, "IP Options"); Assert.AreNotEqual(null, packet.Ethernet.IpV4.Options, "IP Options");
Assert.AreNotEqual(new IpV4Options(new IpV4OptionUnknown(0, new byte[35])), packet.Ethernet.IpV4.Options, "IP Options"); Assert.AreNotEqual(new IpV4Options(new IpV4OptionUnknown(0, new byte[35])), packet.Ethernet.IpV4.Options, "IP Options");
Assert.AreEqual(ipV4Options.GetHashCode(), packet.Ethernet.IpV4.Options.GetHashCode(), "IP Options HashCode"); Assert.AreEqual(ipV4Layer.Options.GetHashCode(), packet.Ethernet.IpV4.Options.GetHashCode(), "IP Options HashCode");
Assert.IsNotNull(packet.Ethernet.IpV4.Options.ToString()); Assert.IsNotNull(packet.Ethernet.IpV4.Options.ToString());
for (int optionIndex = 0; optionIndex != ipV4Options.Count; ++optionIndex) for (int optionIndex = 0; optionIndex != ipV4Layer.Options.Count; ++optionIndex)
{ {
IpV4Option option = ipV4Options[optionIndex]; IpV4Option option = ipV4Layer.Options[optionIndex];
Assert.AreEqual(option, packet.Ethernet.IpV4.Options[optionIndex]); Assert.AreEqual(option, packet.Ethernet.IpV4.Options[optionIndex]);
Assert.IsFalse(option.Equals(null)); Assert.IsFalse(option.Equals(null));
} }
...@@ -205,7 +165,7 @@ namespace PcapDotNet.Packets.Test ...@@ -205,7 +165,7 @@ namespace PcapDotNet.Packets.Test
else else
Assert.IsNull(packet.Ethernet.IpV4.Transport); Assert.IsNull(packet.Ethernet.IpV4.Transport);
Assert.AreEqual(ipV4Payload, packet.Ethernet.IpV4.Payload, "IP Payload"); Assert.AreEqual(payloadLayer, packet.Ethernet.IpV4.Payload.ExtractLayer(), "IP Payload");
} }
} }
......
...@@ -4,6 +4,7 @@ using System.Linq; ...@@ -4,6 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using PcapDotNet.Base; using PcapDotNet.Base;
using PcapDotNet.Packets; using PcapDotNet.Packets;
using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Icmp; using PcapDotNet.Packets.Icmp;
using PcapDotNet.Packets.Igmp; using PcapDotNet.Packets.Igmp;
...@@ -34,8 +35,26 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -34,8 +35,26 @@ namespace PcapDotNet.Packets.TestUtils
return new Packet(buffer, DateTime.Now, random.NextDataLinkKind()); return new Packet(buffer, DateTime.Now, random.NextDataLinkKind());
} }
public static PayloadLayer NextPayloadLayer(this Random random, int length)
{
return new PayloadLayer
{
Data = random.NextDatagram(length)
};
}
// Ethernet // Ethernet
public static EthernetLayer NextEthernetLayer(this Random random)
{
return new EthernetLayer
{
Source = random.NextMacAddress(),
Destination = random.NextMacAddress(),
EtherType = random.NextEnum(EthernetType.None)
};
}
public static MacAddress NextMacAddress(this Random random) public static MacAddress NextMacAddress(this Random random)
{ {
return new MacAddress(random.NextUInt48()); return new MacAddress(random.NextUInt48());
...@@ -71,8 +90,46 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -71,8 +90,46 @@ namespace PcapDotNet.Packets.TestUtils
return random.NextEthernetPacket(packetSize, DateTime.Now, random.NextMacAddress(), random.NextMacAddress()); return random.NextEthernetPacket(packetSize, DateTime.Now, random.NextMacAddress(), random.NextMacAddress());
} }
// ARP
public static ArpLayer NextArpLayer(this Random random)
{
byte hardwareAddressLength = random.NextByte();
byte protocolAddressLength = random.NextByte();
return new ArpLayer
{
ProtocolType = random.NextEnum<EthernetType>(),
Operation = random.NextEnum<ArpOperation>(),
SenderHardwareAddress = random.NextBytes(hardwareAddressLength),
SenderProtocolAddress = random.NextBytes(protocolAddressLength),
TargetHardwareAddress = random.NextBytes(hardwareAddressLength),
TargetProtocolAddress = random.NextBytes(protocolAddressLength)
};
}
// IPv4 // IPv4
public static IpV4Layer NextIpV4Layer(this Random random, IpV4Protocol? protocol)
{
return new IpV4Layer
{
TypeOfService = random.NextByte(),
Identification = random.NextUShort(),
Ttl = random.NextByte(),
Protocol = protocol,
Fragmentation = random.NextIpV4Fragmentation(),
Source = random.NextIpV4Address(),
Destination = random.NextIpV4Address(),
Options = random.NextIpV4Options()
};
}
public static IpV4Layer NextIpV4Layer(this Random random)
{
return random.NextIpV4Layer(random.NextEnum<IpV4Protocol>());
}
public static IpV4Address NextIpV4Address(this Random random) public static IpV4Address NextIpV4Address(this Random random)
{ {
return new IpV4Address(random.NextUInt()); return new IpV4Address(random.NextUInt());
...@@ -254,6 +311,24 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -254,6 +311,24 @@ namespace PcapDotNet.Packets.TestUtils
return new IpV4Options(options); return new IpV4Options(options);
} }
// TCP
public static TcpLayer NextTcpLayer(this Random random)
{
return new TcpLayer
{
SourcePort = random.NextUShort(),
DestinationPort = random.NextUShort(),
SequenceNumber = random.NextUInt(),
AcknowledgmentNumber = random.NextUInt(),
ControlBits = random.NextFlags<TcpControlBits>(),
Window = random.NextUShort(),
UrgentPointer = random.NextUShort(),
Options = random.NextTcpOptions(),
};
}
public static TcpOptionUnknown NextTcpOptionUnknown(this Random random, int maximumOptionLength) public static TcpOptionUnknown NextTcpOptionUnknown(this Random random, int maximumOptionLength)
{ {
TcpOptionType unknownOptionType; TcpOptionType unknownOptionType;
......
using System; using System;
using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.IpV4; using PcapDotNet.Packets.IpV4;
...@@ -146,6 +148,19 @@ namespace PcapDotNet.Packets.Arp ...@@ -146,6 +148,19 @@ namespace PcapDotNet.Packets.Arp
get { return ReadIpV4Address(OffsetTargetProtocolAddress, Endianity.Big); } get { return ReadIpV4Address(OffsetTargetProtocolAddress, Endianity.Big); }
} }
public override ILayer ExtractLayer()
{
return new ArpLayer
{
ProtocolType = ProtocolType,
Operation = Operation,
SenderHardwareAddress = SenderHardwareAddress,
SenderProtocolAddress = SenderProtocolAddress,
TargetHardwareAddress = TargetHardwareAddress,
TargetProtocolAddress = TargetProtocolAddress
};
}
/// <summary> /// <summary>
/// The datagram is valid if the length is correct according to the header. /// The datagram is valid if the length is correct according to the header.
/// </summary> /// </summary>
...@@ -166,13 +181,13 @@ namespace PcapDotNet.Packets.Arp ...@@ -166,13 +181,13 @@ namespace PcapDotNet.Packets.Arp
internal static void WriteHeader(byte[] buffer, int offset, internal static void WriteHeader(byte[] buffer, int offset,
ArpHardwareType hardwareType, EthernetType protocolType, ArpOperation operation, ArpHardwareType hardwareType, EthernetType protocolType, ArpOperation operation,
byte[] senderHardwareAddress, byte[] senderProtocolAddress, IList<byte> senderHardwareAddress, IList<byte> senderProtocolAddress,
byte[] targetHardwareAddress, byte[] targetProtocolAddress) IList<byte> targetHardwareAddress, IList<byte> targetProtocolAddress)
{ {
buffer.Write(ref offset, (ushort)hardwareType, Endianity.Big); buffer.Write(ref offset, (ushort)hardwareType, Endianity.Big);
buffer.Write(ref offset, (ushort)protocolType, Endianity.Big); buffer.Write(ref offset, (ushort)protocolType, Endianity.Big);
buffer.Write(ref offset, (byte)senderHardwareAddress.Length); buffer.Write(ref offset, (byte)senderHardwareAddress.Count);
buffer.Write(ref offset, (byte)senderProtocolAddress.Length); buffer.Write(ref offset, (byte)senderProtocolAddress.Count);
buffer.Write(ref offset, (ushort)operation, Endianity.Big); buffer.Write(ref offset, (ushort)operation, Endianity.Big);
buffer.Write(ref offset, senderHardwareAddress); buffer.Write(ref offset, senderHardwareAddress);
buffer.Write(ref offset, senderProtocolAddress); buffer.Write(ref offset, senderProtocolAddress);
......
...@@ -480,6 +480,83 @@ namespace PcapDotNet.Packets.Igmp ...@@ -480,6 +480,83 @@ namespace PcapDotNet.Packets.Igmp
} }
} }
public override ILayer ExtractLayer()
{
// IgmpMessageType igmpMessageType = random.NextEnum(IgmpMessageType.None);
// IgmpQueryVersion igmpQueryVersion = IgmpQueryVersion.None;
// TimeSpan igmpMaxResponseTime = random.NextTimeSpan(TimeSpan.FromSeconds(0.1), TimeSpan.FromSeconds(256 * 0.1) - TimeSpan.FromTicks(1));
// IpV4Address igmpGroupAddress = random.NextIpV4Address();
// bool? igmpIsSuppressRouterSideProcessing = null;
// byte? igmpQueryRobustnessVariable = null;
// TimeSpan? igmpQueryInterval = null;
// IpV4Address[] igmpSourceAddresses = null;
// IgmpGroupRecord[] igmpGroupRecords = null;
switch (MessageType)
{
case IgmpMessageType.MembershipQuery:
switch (QueryVersion)
{
case IgmpQueryVersion.Version1:
return new IgmpQueryVersion1Layer
{
GroupAddress = GroupAddress
};
case IgmpQueryVersion.Version2:
return new IgmpQueryVersion2Layer
{
MaxResponseTime = MaxResponseTime,
GroupAddress = GroupAddress
};
case IgmpQueryVersion.Version3:
return new IgmpQueryVersion3Layer
{
MaxResponseTime = MaxResponseTime,
GroupAddress = GroupAddress,
IsSuppressRouterSideProcessing = IsSuppressRouterSideProcessing,
QueryRobustnessVariable = QueryRobustnessVariable,
QueryInterval = QueryInterval,
SourceAddresses = SourceAddresses
};
default:
throw new InvalidOperationException("Invalid Query Version " + QueryVersion);
}
case IgmpMessageType.MembershipReportVersion1:
return new IgmpReportVersion1Layer
{
GroupAddress = GroupAddress
};
case IgmpMessageType.MembershipReportVersion2:
return new IgmpReportVersion2Layer
{
MaxResponseTime = MaxResponseTime,
GroupAddress = GroupAddress
};
case IgmpMessageType.LeaveGroupVersion2:
return new IgmpLeaveGroupVersion2Layer
{
MaxResponseTime = MaxResponseTime,
GroupAddress = GroupAddress
};
case IgmpMessageType.MembershipReportVersion3:
return new IgmpReportVersion3Layer
{
GroupRecords = GroupRecords.Select(record => record.ToGroupRecord()).ToList()
};
default:
throw new InvalidOperationException("Invalid message type " + MessageType);
}
}
internal IgmpDatagram(byte[] buffer, int offset, int length) internal IgmpDatagram(byte[] buffer, int offset, int length)
: base(buffer, offset, length) : base(buffer, offset, length)
{ {
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using PcapDotNet.Base;
using PcapDotNet.Packets.Arp; using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Icmp; using PcapDotNet.Packets.Icmp;
...@@ -137,6 +138,11 @@ namespace PcapDotNet.Packets ...@@ -137,6 +138,11 @@ namespace PcapDotNet.Packets
{ {
return base.Equals(other) && Equals(other as EthernetLayer); return base.Equals(other) && Equals(other as EthernetLayer);
} }
public override string ToString()
{
return Source + " -> " + Destination + " (" + EtherType + ")";
}
} }
public class PayloadLayer : SimpleLayer public class PayloadLayer : SimpleLayer
...@@ -261,6 +267,11 @@ namespace PcapDotNet.Packets ...@@ -261,6 +267,11 @@ namespace PcapDotNet.Packets
{ {
return base.Equals(other) && Equals(other as IpV4Layer); return base.Equals(other) && Equals(other as IpV4Layer);
} }
public override string ToString()
{
return Source + " -> " + Destination + " (" + Protocol + ")";
}
} }
public abstract class TransportLayer : Layer, IIpV4NextTransportLayer public abstract class TransportLayer : Layer, IIpV4NextTransportLayer
...@@ -341,7 +352,7 @@ namespace PcapDotNet.Packets ...@@ -341,7 +352,7 @@ namespace PcapDotNet.Packets
SequenceNumber == other.SequenceNumber && AcknowledgmentNumber == other.AcknowledgmentNumber && SequenceNumber == other.SequenceNumber && AcknowledgmentNumber == other.AcknowledgmentNumber &&
ControlBits == other.ControlBits && ControlBits == other.ControlBits &&
Window == other.Window && UrgentPointer == other.UrgentPointer && Window == other.Window && UrgentPointer == other.UrgentPointer &&
Options == other.Options; Options.Equals(other.Options);
} }
public override sealed bool Equals(TransportLayer other) public override sealed bool Equals(TransportLayer other)
...@@ -391,13 +402,13 @@ namespace PcapDotNet.Packets ...@@ -391,13 +402,13 @@ namespace PcapDotNet.Packets
public ArpOperation Operation { get; set; } public ArpOperation Operation { get; set; }
public byte[] SenderHardwareAddress { get; set; } public IList<byte> SenderHardwareAddress { get; set; }
public byte[] SenderProtocolAddress { get; set; } public IList<byte> SenderProtocolAddress { get; set; }
public byte[] TargetHardwareAddress { get; set; } public IList<byte> TargetHardwareAddress { get; set; }
public byte[] TargetProtocolAddress { get; set; } public IList<byte> TargetProtocolAddress { get; set; }
public EthernetType PreviousLayerEtherType public EthernetType PreviousLayerEtherType
{ {
...@@ -411,7 +422,7 @@ namespace PcapDotNet.Packets ...@@ -411,7 +422,7 @@ namespace PcapDotNet.Packets
public override int Length public override int Length
{ {
get { return ArpDatagram.GetHeaderLength(SenderHardwareAddress.Length, SenderProtocolAddress.Length); } get { return ArpDatagram.GetHeaderLength(SenderHardwareAddress.Count, SenderProtocolAddress.Count); }
} }
public override void Write(byte[] buffer, int offset, int payloadLength, ILayer previousLayer, ILayer nextLayer) public override void Write(byte[] buffer, int offset, int payloadLength, ILayer previousLayer, ILayer nextLayer)
...@@ -423,15 +434,15 @@ namespace PcapDotNet.Packets ...@@ -423,15 +434,15 @@ namespace PcapDotNet.Packets
if (arpPreviousLayer == null) if (arpPreviousLayer == null)
throw new ArgumentException("The layer before the ARP layer must be an ARP previous layer and can't be " + previousLayer.GetType()); throw new ArgumentException("The layer before the ARP layer must be an ARP previous layer and can't be " + previousLayer.GetType());
if (SenderHardwareAddress.Length != TargetHardwareAddress.Length) if (SenderHardwareAddress.Count != TargetHardwareAddress.Count)
{ {
throw new ArgumentException("Sender hardware address length is " + SenderHardwareAddress.Length + " bytes " + throw new ArgumentException("Sender hardware address length is " + SenderHardwareAddress.Count + " bytes " +
"while target hardware address length is " + TargetHardwareAddress.Length + " bytes"); "while target hardware address length is " + TargetHardwareAddress.Count + " bytes");
} }
if (SenderProtocolAddress.Length != TargetProtocolAddress.Length) if (SenderProtocolAddress.Count != TargetProtocolAddress.Count)
{ {
throw new ArgumentException("Sender protocol address length is " + SenderProtocolAddress.Length + " bytes " + throw new ArgumentException("Sender protocol address length is " + SenderProtocolAddress.Count + " bytes " +
"while target protocol address length is " + TargetProtocolAddress.Length + " bytes"); "while target protocol address length is " + TargetProtocolAddress.Count + " bytes");
} }
ArpDatagram.WriteHeader(buffer, offset, ArpDatagram.WriteHeader(buffer, offset,
...@@ -474,7 +485,7 @@ namespace PcapDotNet.Packets ...@@ -474,7 +485,7 @@ namespace PcapDotNet.Packets
return other != null && return other != null &&
MessageType == other.MessageType && MessageType == other.MessageType &&
QueryVersion == other.QueryVersion && QueryVersion == other.QueryVersion &&
MaxResponseTimeValue == other.MaxResponseTimeValue; MaxResponseTimeValue.Divide(2) <= other.MaxResponseTimeValue && MaxResponseTimeValue.Multiply(2) >= other.MaxResponseTimeValue;
} }
public sealed override bool Equals(Layer other) public sealed override bool Equals(Layer other)
...@@ -573,11 +584,11 @@ namespace PcapDotNet.Packets ...@@ -573,11 +584,11 @@ namespace PcapDotNet.Packets
public TimeSpan QueryInterval{get; set ;} public TimeSpan QueryInterval{get; set ;}
public IpV4Address[] SourceAddresses{get; set ;} public IList<IpV4Address> SourceAddresses{get; set ;}
public override int Length public override int Length
{ {
get { return IgmpDatagram.GetQueryVersion3Length(SourceAddresses.Length); } get { return IgmpDatagram.GetQueryVersion3Length(SourceAddresses.Count); }
} }
protected override void Write(byte[] buffer, int offset) protected override void Write(byte[] buffer, int offset)
...@@ -611,7 +622,7 @@ namespace PcapDotNet.Packets ...@@ -611,7 +622,7 @@ namespace PcapDotNet.Packets
GroupAddress == other.GroupAddress && GroupAddress == other.GroupAddress &&
IsSuppressRouterSideProcessing == other.IsSuppressRouterSideProcessing && IsSuppressRouterSideProcessing == other.IsSuppressRouterSideProcessing &&
QueryRobustnessVariable == other.QueryRobustnessVariable && QueryRobustnessVariable == other.QueryRobustnessVariable &&
QueryInterval == other.QueryInterval && QueryInterval.Divide(2) <= other.QueryInterval && QueryInterval.Multiply(2) >= other.QueryInterval &&
SourceAddresses.SequenceEqual(other.SourceAddresses); SourceAddresses.SequenceEqual(other.SourceAddresses);
} }
...@@ -647,7 +658,7 @@ namespace PcapDotNet.Packets ...@@ -647,7 +658,7 @@ namespace PcapDotNet.Packets
public class IgmpReportVersion3Layer : IgmpLayer public class IgmpReportVersion3Layer : IgmpLayer
{ {
public IgmpGroupRecord[] GroupRecords{get; set ;} public IList<IgmpGroupRecord> GroupRecords{get; set ;}
public override int Length public override int Length
{ {
......
...@@ -166,14 +166,6 @@ namespace PcapDotNet.Packets.Transport ...@@ -166,14 +166,6 @@ namespace PcapDotNet.Packets.Transport
} }
} }
/// <summary>
/// The payload of the TCP datagram.
/// </summary>
public Datagram Payload
{
get { return new Datagram(Buffer, StartOffset + HeaderLength, PayloadLength); }
}
/// <summary> /// <summary>
/// The length of the TCP payload. /// The length of the TCP payload.
/// </summary> /// </summary>
...@@ -246,6 +238,29 @@ namespace PcapDotNet.Packets.Transport ...@@ -246,6 +238,29 @@ namespace PcapDotNet.Packets.Transport
get { return (ControlBits & TcpControlBits.Fin) == TcpControlBits.Fin; } get { return (ControlBits & TcpControlBits.Fin) == TcpControlBits.Fin; }
} }
public override ILayer ExtractLayer()
{
return new TcpLayer
{
SourcePort = SourcePort,
DestinationPort = DestinationPort,
SequenceNumber = SequenceNumber,
AcknowledgmentNumber = AcknowledgmentNumber,
ControlBits = ControlBits,
Window = Window,
UrgentPointer = UrgentPointer,
Options = Options
};
}
/// <summary>
/// The payload of the TCP datagram.
/// </summary>
public Datagram Payload
{
get { return new Datagram(Buffer, StartOffset + HeaderLength, PayloadLength); }
}
/// <summary> /// <summary>
/// The datagram is valid if the length is correct according to the header and the options are valid. /// The datagram is valid if the length is correct according to the header and the options are valid.
/// </summary> /// </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