Commit 0ac5b87b authored by Brickner_cp's avatar Brickner_cp

Add Ip property to Ethernet based datagrams and Ip datagrams to return either IPv4 or IPv6.

Fix IPv4 validity to be based (also) on inner IPv4 or IPv6 payloads.
Fix IPv6 validity to be based on inner payloads.
parent 5d729d8f
...@@ -61,6 +61,7 @@ namespace PcapDotNet.Packets.Test ...@@ -61,6 +61,7 @@ namespace PcapDotNet.Packets.Test
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(true);
UdpLayer udpLayer = random.NextUdpLayer(); UdpLayer udpLayer = random.NextUdpLayer();
udpLayer.Checksum = null; udpLayer.Checksum = null;
...@@ -73,19 +74,19 @@ namespace PcapDotNet.Packets.Test ...@@ -73,19 +74,19 @@ namespace PcapDotNet.Packets.Test
dnsLayer = random.NextDnsLayer(); dnsLayer = random.NextDnsLayer();
} while (dnsLayer.Length > 65000); } while (dnsLayer.Length > 65000);
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV4Layer, udpLayer, dnsLayer); Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipLayer, udpLayer, dnsLayer);
Assert.IsTrue(packet.IsValid, "IsValid"); Assert.IsTrue(packet.IsValid, "IsValid");
// DNS // DNS
DnsLayer actualLayer = (DnsLayer)packet.Ethernet.IpV4.Udp.Dns.ExtractLayer(); DnsLayer actualLayer = (DnsLayer)packet.Ethernet.Ip.Udp.Dns.ExtractLayer();
Assert.AreEqual(dnsLayer, actualLayer, "DNS Layer"); Assert.AreEqual(dnsLayer, actualLayer, "DNS Layer");
Assert.IsTrue(packet.Ethernet.IpV4.Udp.Dns.IsValid); Assert.IsTrue(packet.Ethernet.Ip.Udp.Dns.IsValid);
DnsDataResourceRecord opt = packet.Ethernet.IpV4.Udp.Dns.Additionals.FirstOrDefault(additional => additional.DnsType == DnsType.Opt); DnsDataResourceRecord opt = packet.Ethernet.Ip.Udp.Dns.Additionals.FirstOrDefault(additional => additional.DnsType == DnsType.Opt);
Assert.AreEqual(opt, packet.Ethernet.IpV4.Udp.Dns.OptionsRecord); Assert.AreEqual(opt, packet.Ethernet.Ip.Udp.Dns.OptionsRecord);
foreach (var record in packet.Ethernet.IpV4.Udp.Dns.ResourceRecords) foreach (var record in packet.Ethernet.Ip.Udp.Dns.ResourceRecords)
{ {
Assert.IsTrue(record.Equals(record)); Assert.IsTrue(record.Equals(record));
Assert.IsTrue(record.DomainName.Equals((object)record.DomainName)); Assert.IsTrue(record.DomainName.Equals((object)record.DomainName));
...@@ -93,7 +94,7 @@ namespace PcapDotNet.Packets.Test ...@@ -93,7 +94,7 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(record.GetHashCode(), record.GetHashCode()); Assert.AreEqual(record.GetHashCode(), record.GetHashCode());
} }
foreach (var record in packet.Ethernet.IpV4.Udp.Dns.DataResourceRecords) foreach (var record in packet.Ethernet.Ip.Udp.Dns.DataResourceRecords)
{ {
MoreAssert.IsBiggerOrEqual(9, record.ToString().Length); MoreAssert.IsBiggerOrEqual(9, record.ToString().Length);
Assert.IsTrue(record.Equals((object)record)); Assert.IsTrue(record.Equals((object)record));
......
...@@ -55,41 +55,55 @@ namespace PcapDotNet.Packets.Test ...@@ -55,41 +55,55 @@ namespace PcapDotNet.Packets.Test
}; };
Random random = new Random(); Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(seed);
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(IpV4Protocol.Gre, false);
for (int i = 0; i != 200; ++i) for (int i = 0; i != 200; ++i)
{ {
GreLayer greLayer = random.NextGreLayer(); GreLayer greLayer = random.NextGreLayer();
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(100)); PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(100));
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer, payloadLayer); PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, greLayer, payloadLayer);
Packet packet = packetBuilder.Build(DateTime.Now); Packet packet = packetBuilder.Build(DateTime.Now);
if (greLayer.Checksum == null && if (greLayer.Checksum == null &&
!new[] { EthernetType.IpV4, EthernetType.IpV6, EthernetType.Arp, EthernetType.VLanTaggedFrame }.Contains(packet.Ethernet.IpV4.Gre.ProtocolType)) !new[] { EthernetType.IpV4, EthernetType.IpV6, EthernetType.Arp, EthernetType.VLanTaggedFrame }.Contains(packet.Ethernet.Ip.Gre.ProtocolType))
{ {
Assert.IsTrue(packet.IsValid, "IsValid, ProtocolType=" + packet.Ethernet.IpV4.Gre.ProtocolType); Assert.IsTrue(packet.IsValid, "IsValid, ProtocolType=" + packet.Ethernet.Ip.Gre.ProtocolType);
} }
// Ethernet // Ethernet
ethernetLayer.EtherType = EthernetType.IpV4; ethernetLayer.EtherType = ipLayer == ipV4Layer ? EthernetType.IpV4 : EthernetType.IpV6;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer"); Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
ethernetLayer.EtherType = EthernetType.None;
// IPv4 // IP.
ipV4Layer.Protocol = IpV4Protocol.Gre; if (ipLayer == ipV4Layer)
ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.IpV4.ExtractLayer()).HeaderChecksum; {
Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer()); // IPv4.
ipV4Layer.HeaderChecksum = null; ipV4Layer.Protocol = IpV4Protocol.Gre;
Assert.AreEqual(ipV4Layer.Length, packet.Ethernet.IpV4.HeaderLength); ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.Ip.ExtractLayer()).HeaderChecksum;
Assert.IsTrue(packet.Ethernet.IpV4.IsHeaderChecksumCorrect); Assert.AreEqual(ipV4Layer, packet.Ethernet.Ip.ExtractLayer());
Assert.AreEqual(ipV4Layer.Length + greLayer.Length + payloadLayer.Length, ipV4Layer.HeaderChecksum = null;
packet.Ethernet.IpV4.TotalLength); Assert.AreEqual(ipV4Layer.Length, packet.Ethernet.IpV4.HeaderLength);
Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.IpV4.Version); Assert.IsTrue(packet.Ethernet.IpV4.IsHeaderChecksumCorrect);
Assert.AreEqual(ipV4Layer.Length + greLayer.Length + payloadLayer.Length,
packet.Ethernet.Ip.TotalLength);
Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.Ip.Version);
}
else
{
// IPv6.
Assert.AreEqual(ipLayer, packet.Ethernet.Ip.ExtractLayer());
}
// GRE // GRE
GreDatagram actualGre = packet.Ethernet.IpV4.Gre; GreDatagram actualGre = packet.Ethernet.Ip.Gre;
GreLayer actualGreLayer = (GreLayer)actualGre.ExtractLayer(); GreLayer actualGreLayer = (GreLayer)actualGre.ExtractLayer();
if (greLayer.ChecksumPresent && greLayer.Checksum == null) if (greLayer.ChecksumPresent && greLayer.Checksum == null)
{ {
...@@ -204,11 +218,15 @@ namespace PcapDotNet.Packets.Test ...@@ -204,11 +218,15 @@ namespace PcapDotNet.Packets.Test
}; };
Random random = new Random(); Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(seed);
for (int i = 0; i != 100; ++i) for (int i = 0; i != 100; ++i)
{ {
IpV4Layer ipV4Layer = random.NextIpV4Layer(IpV4Protocol.Gre); IpV4Layer ipV4Layer = random.NextIpV4Layer(IpV4Protocol.Gre);
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(IpV4Protocol.Gre, false);
GreLayer greLayer = random.NextGreLayer(); GreLayer greLayer = random.NextGreLayer();
greLayer.Checksum = null; greLayer.Checksum = null;
...@@ -219,26 +237,26 @@ namespace PcapDotNet.Packets.Test ...@@ -219,26 +237,26 @@ namespace PcapDotNet.Packets.Test
0) 0)
}.AsReadOnly(); }.AsReadOnly();
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer); PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, greLayer);
Packet packet = packetBuilder.Build(DateTime.Now); Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid || Assert.IsTrue(packet.IsValid ||
new[] { EthernetType.IpV4, EthernetType.IpV6, EthernetType.Arp, EthernetType.VLanTaggedFrame }.Contains(greLayer.ProtocolType), new[] { EthernetType.IpV4, EthernetType.IpV6, EthernetType.Arp, EthernetType.VLanTaggedFrame }.Contains(greLayer.ProtocolType),
"IsValid. ProtoclType=" + greLayer.ProtocolType); "IsValid. ProtoclType=" + greLayer.ProtocolType);
GreDatagram gre = packet.Ethernet.IpV4.Gre; GreDatagram gre = packet.Ethernet.Ip.Gre;
// Remove a byte from routing // Remove a byte from routing
Datagram newIpPayload = new Datagram(gre.Take(gre.Length - 1).ToArray()); Datagram newIpPayload = new Datagram(gre.Take(gre.Length - 1).ToArray());
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload}); packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsNull(packet.Ethernet.IpV4.Gre.Payload); Assert.IsNull(packet.Ethernet.Ip.Gre.Payload);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
// SreLength is too big // SreLength is too big
byte[] buffer = gre.ToArray(); byte[] buffer = gre.ToArray();
buffer[buffer.Length - 1] = 200; buffer[buffer.Length - 1] = 200;
newIpPayload = new Datagram(buffer); newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload}); packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
...@@ -246,7 +264,7 @@ namespace PcapDotNet.Packets.Test ...@@ -246,7 +264,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray(); buffer = gre.ToArray();
buffer[gre.Length - 10] = 100; buffer[gre.Length - 10] = 100;
newIpPayload = new Datagram(buffer); newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload}); packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
...@@ -254,7 +272,7 @@ namespace PcapDotNet.Packets.Test ...@@ -254,7 +272,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray(); buffer = gre.ToArray();
buffer[gre.Length - 10] = 3; buffer[gre.Length - 10] = 3;
newIpPayload = new Datagram(buffer); newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload}); packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
...@@ -262,7 +280,7 @@ namespace PcapDotNet.Packets.Test ...@@ -262,7 +280,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray(); buffer = gre.ToArray();
buffer[gre.Length - 16] = 1; buffer[gre.Length - 16] = 1;
newIpPayload = new Datagram(buffer); newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload}); packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
} }
......
...@@ -52,21 +52,25 @@ namespace PcapDotNet.Packets.Test ...@@ -52,21 +52,25 @@ namespace PcapDotNet.Packets.Test
[TestMethod] [TestMethod]
public void RandomHttpTest() public void RandomHttpTest()
{ {
Random random = new Random(); Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(seed);
for (int i = 0; i != 200; ++i) for (int i = 0; i != 200; ++i)
{ {
EthernetLayer ethernetLayer = random.NextEthernetLayer(EthernetType.None); EthernetLayer ethernetLayer = random.NextEthernetLayer(EthernetType.None);
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(true);
TcpLayer tcpLayer = random.NextTcpLayer(); TcpLayer tcpLayer = random.NextTcpLayer();
tcpLayer.Checksum = null; tcpLayer.Checksum = null;
HttpLayer httpLayer = random.NextHttpLayer(); HttpLayer httpLayer = random.NextHttpLayer();
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV4Layer, tcpLayer, httpLayer); Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipLayer, tcpLayer, httpLayer);
Assert.IsTrue(packet.IsValid, "IsValid"); Assert.IsTrue(packet.IsValid, "IsValid");
HttpDatagram httpDatagram = packet.Ethernet.IpV4.Tcp.Http; HttpDatagram httpDatagram = packet.Ethernet.Ip.Tcp.Http;
Assert.AreEqual(httpLayer.Version, httpDatagram.Version); Assert.AreEqual(httpLayer.Version, httpDatagram.Version);
if (httpLayer.Version != null) if (httpLayer.Version != null)
Assert.AreEqual(httpLayer.Version.GetHashCode(), httpDatagram.Version.GetHashCode()); Assert.AreEqual(httpLayer.Version.GetHashCode(), httpDatagram.Version.GetHashCode());
...@@ -76,7 +80,7 @@ namespace PcapDotNet.Packets.Test ...@@ -76,7 +80,7 @@ namespace PcapDotNet.Packets.Test
Assert.IsTrue(httpLayer.IsRequest); Assert.IsTrue(httpLayer.IsRequest);
Assert.IsFalse(httpDatagram.IsResponse); Assert.IsFalse(httpDatagram.IsResponse);
Assert.IsFalse(httpLayer.IsResponse); Assert.IsFalse(httpLayer.IsResponse);
HttpRequestLayer httpRequestLayer = (HttpRequestLayer)httpLayer; HttpRequestLayer httpRequestLayer = (HttpRequestLayer)httpLayer;
HttpRequestDatagram httpRequestDatagram = (HttpRequestDatagram)httpDatagram; HttpRequestDatagram httpRequestDatagram = (HttpRequestDatagram)httpDatagram;
Assert.AreEqual(httpRequestLayer.Method, httpRequestDatagram.Method); Assert.AreEqual(httpRequestLayer.Method, httpRequestDatagram.Method);
......
...@@ -102,7 +102,9 @@ namespace PcapDotNet.Packets.Test ...@@ -102,7 +102,9 @@ namespace PcapDotNet.Packets.Test
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV4Layer, payloadLayer); Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV4Layer, payloadLayer);
Assert.IsTrue(ipV4Layer.Protocol == IpV4Protocol.Udp || Assert.IsTrue(ipV4Layer.Protocol == IpV4Protocol.Ip ||
ipV4Layer.Protocol == IpV4Protocol.IpV6 ||
ipV4Layer.Protocol == IpV4Protocol.Udp ||
ipV4Layer.Protocol == IpV4Protocol.Tcp || ipV4Layer.Protocol == IpV4Protocol.Tcp ||
ipV4Layer.Protocol == IpV4Protocol.InternetGroupManagementProtocol || ipV4Layer.Protocol == IpV4Protocol.InternetGroupManagementProtocol ||
ipV4Layer.Protocol == IpV4Protocol.InternetControlMessageProtocol || ipV4Layer.Protocol == IpV4Protocol.InternetControlMessageProtocol ||
......
...@@ -67,6 +67,9 @@ namespace PcapDotNet.Packets.Test ...@@ -67,6 +67,9 @@ namespace PcapDotNet.Packets.Test
}; };
Random random = new Random(); Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(1930237499);
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
...@@ -74,12 +77,22 @@ namespace PcapDotNet.Packets.Test ...@@ -74,12 +77,22 @@ namespace PcapDotNet.Packets.Test
PayloadLayer payloadLayer = random.NextPayloadLayer(random.NextInt(0, 50 * 1024)); PayloadLayer payloadLayer = random.NextPayloadLayer(random.NextInt(0, 50 * 1024));
if (i < 26)
continue;
List<ILayer> layers = new List<ILayer> {ethernetLayer, ipV6Layer}; List<ILayer> layers = new List<ILayer> {ethernetLayer, ipV6Layer};
if (ipV6Layer.ExtensionHeaders.LastHeader != IpV4Protocol.EncapsulatingSecurityPayload) if (ipV6Layer.ExtensionHeaders.LastHeader != IpV4Protocol.EncapsulatingSecurityPayload)
layers.Add(payloadLayer); layers.Add(payloadLayer);
Packet packet = PacketBuilder.Build(DateTime.Now, layers); Packet packet = PacketBuilder.Build(DateTime.Now, layers);
Assert.IsTrue(packet.IsValid, string.Format("IsValid ({0}...{1})", ipV6Layer.NextHeader, ipV6Layer.ExtensionHeaders.NextHeader)); Assert.IsTrue(ipV6Layer.LastNextHeader == IpV4Protocol.Ip ||
ipV6Layer.LastNextHeader == IpV4Protocol.IpV6||
ipV6Layer.LastNextHeader == IpV4Protocol.Udp ||
ipV6Layer.LastNextHeader == IpV4Protocol.Tcp ||
ipV6Layer.LastNextHeader == IpV4Protocol.InternetGroupManagementProtocol ||
ipV6Layer.LastNextHeader == IpV4Protocol.InternetControlMessageProtocol ||
ipV6Layer.LastNextHeader == IpV4Protocol.Gre ||
packet.IsValid, string.Format("IsValid ({0}...{1})", ipV6Layer.NextHeader, ipV6Layer.ExtensionHeaders.NextHeader));
// Ethernet // Ethernet
Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLengthValue, packet.Ethernet.PayloadLength, "PayloadLength"); Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLengthValue, packet.Ethernet.PayloadLength, "PayloadLength");
......
...@@ -5,6 +5,7 @@ using PcapDotNet.Packets.IpV4; ...@@ -5,6 +5,7 @@ using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.IpV6; using PcapDotNet.Packets.IpV6;
using PcapDotNet.Packets.TestUtils; using PcapDotNet.Packets.TestUtils;
using PcapDotNet.Packets.Transport; using PcapDotNet.Packets.Transport;
using PcapDotNet.TestUtils;
namespace PcapDotNet.Packets.Test namespace PcapDotNet.Packets.Test
{ {
...@@ -43,7 +44,7 @@ namespace PcapDotNet.Packets.Test ...@@ -43,7 +44,7 @@ namespace PcapDotNet.Packets.Test
#endregion #endregion
[TestMethod] [TestMethod]
public void RandomTcpOverIpV4Test() public void RandomTcpTest()
{ {
MacAddress ethernetSource = new MacAddress("00:01:02:03:04:05"); MacAddress ethernetSource = new MacAddress("00:01:02:03:04:05");
MacAddress ethernetDestination = new MacAddress("A0:A1:A2:A3:A4:A5"); MacAddress ethernetDestination = new MacAddress("A0:A1:A2:A3:A4:A5");
...@@ -55,108 +56,57 @@ namespace PcapDotNet.Packets.Test ...@@ -55,108 +56,57 @@ namespace PcapDotNet.Packets.Test
}; };
Random random = new Random(); Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: {0}", seed);
random = new Random(830476811);
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
for (int i = 0; i != 500; ++i)
{
TcpLayer tcpLayer = random.NextTcpLayer();
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(60000));
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV4Layer, tcpLayer, payloadLayer);
Assert.IsTrue(packet.IsValid);
// Ethernet
ethernetLayer.EtherType = EthernetType.IpV4;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
// IpV4
ipV4Layer.Protocol = IpV4Protocol.Tcp;
ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.IpV4.ExtractLayer()).HeaderChecksum;
Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer(), "IP Layer");
ipV4Layer.HeaderChecksum = null;
// TCP
tcpLayer.Checksum = packet.Ethernet.IpV4.Tcp.Checksum;
Assert.AreEqual(tcpLayer, packet.Ethernet.IpV4.Tcp.ExtractLayer(), "TCP Layer");
Assert.AreNotEqual(random.NextTcpLayer(), packet.Ethernet.IpV4.Tcp.ExtractLayer(), "TCP Layer");
Assert.AreEqual(tcpLayer.GetHashCode(), packet.Ethernet.IpV4.Tcp.ExtractLayer().GetHashCode(), "TCP Layer");
Assert.AreNotEqual(random.NextTcpLayer().GetHashCode(), packet.Ethernet.IpV4.Tcp.ExtractLayer().GetHashCode(), "TCP Layer");
Assert.AreEqual(packet.Ethernet.IpV4.Tcp.SequenceNumber + packet.Ethernet.IpV4.Tcp.PayloadLength, packet.Ethernet.IpV4.Tcp.NextSequenceNumber);
foreach (TcpOption option in packet.Ethernet.IpV4.Tcp.Options.OptionsCollection)
{
Assert.AreEqual(option, option);
Assert.AreEqual(option.GetHashCode(), option.GetHashCode());
Assert.IsFalse(string.IsNullOrEmpty(option.ToString()));
Assert.IsFalse(option.Equals(null));
Assert.IsFalse(option.Equals(2));
}
Assert.AreEqual(tcpLayer.Options, packet.Ethernet.IpV4.Tcp.Options, "Options");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Acknowledgment) == TcpControlBits.Acknowledgment, packet.Ethernet.IpV4.Tcp.IsAcknowledgment, "IsAcknowledgment");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.CongestionWindowReduced) == TcpControlBits.CongestionWindowReduced, packet.Ethernet.IpV4.Tcp.IsCongestionWindowReduced, "IsCongestionWindowReduced");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.ExplicitCongestionNotificationEcho) == TcpControlBits.ExplicitCongestionNotificationEcho, packet.Ethernet.IpV4.Tcp.IsExplicitCongestionNotificationEcho, "IsExplicitCongestionNotificationEcho");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Fin) == TcpControlBits.Fin, packet.Ethernet.IpV4.Tcp.IsFin, "IsFin");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Push) == TcpControlBits.Push, packet.Ethernet.IpV4.Tcp.IsPush, "IsPush");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Reset) == TcpControlBits.Reset, packet.Ethernet.IpV4.Tcp.IsReset, "IsReset");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Synchronize) == TcpControlBits.Synchronize, packet.Ethernet.IpV4.Tcp.IsSynchronize, "IsSynchronize");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Urgent) == TcpControlBits.Urgent, packet.Ethernet.IpV4.Tcp.IsUrgent, "IsUrgent");
Assert.AreEqual(0, packet.Ethernet.IpV4.Tcp.Reserved);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(TcpDatagram.HeaderMinimumLength + tcpLayer.Options.BytesLength + payloadLayer.Length, packet.Ethernet.IpV4.Tcp.Length, "Total Length");
Assert.IsTrue(packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.AreEqual(payloadLayer.Data, packet.Ethernet.IpV4.Tcp.Payload, "Payload");
}
}
// TODO: Merge this test with the above one.
[TestMethod]
public void RandomTcpOverIpV6Test()
{
MacAddress ethernetSource = new MacAddress("00:01:02:03:04:05");
MacAddress ethernetDestination = new MacAddress("A0:A1:A2:A3:A4:A5");
EthernetLayer ethernetLayer = new EthernetLayer
{
Source = ethernetSource,
Destination = ethernetDestination
};
Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: {0}", seed);
random = new Random(seed);
IpV6Layer ipV6Layer = random.NextIpV6Layer(IpV4Protocol.Tcp, false); IpV6Layer ipV6Layer = random.NextIpV6Layer(IpV4Protocol.Tcp, false);
for (int i = 0; i != 500; ++i) for (int i = 0; i != 1000; ++i)
{ {
EthernetType ethernetType = random.NextBool() ? EthernetType.IpV4 : EthernetType.IpV6;
Layer ipLayer = (ethernetType == EthernetType.IpV4 ? (Layer)ipV4Layer : ipV6Layer);
TcpLayer tcpLayer = random.NextTcpLayer(); TcpLayer tcpLayer = random.NextTcpLayer();
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(60000)); PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(60000));
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV6Layer, tcpLayer, payloadLayer); if (i < 2)
continue;
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipLayer, tcpLayer, payloadLayer);
Assert.IsTrue(packet.IsValid); Assert.IsTrue(packet.IsValid);
// Ethernet // Ethernet
ethernetLayer.EtherType = EthernetType.IpV6; ethernetLayer.EtherType = ethernetType;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer"); Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
ethernetLayer.EtherType = EthernetType.None;
// IpV6 // Ip.
Assert.AreEqual(ipV6Layer, packet.Ethernet.IpV6.ExtractLayer(), "IP Layer"); if (ipLayer == ipV4Layer)
{
// IpV4.
ipV4Layer.Protocol = IpV4Protocol.Tcp;
ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.IpV4.ExtractLayer()).HeaderChecksum;
Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer(), "IPv4 Layer");
ipV4Layer.HeaderChecksum = null;
}
else
{
Assert.AreEqual(ipV6Layer, packet.Ethernet.IpV6.ExtractLayer(), "IPv6 Layer");
}
// TCP // TCP
tcpLayer.Checksum = packet.Ethernet.IpV6.Tcp.Checksum; tcpLayer.Checksum = packet.Ethernet.Ip.Tcp.Checksum;
Assert.AreEqual(tcpLayer, packet.Ethernet.IpV6.Tcp.ExtractLayer(), "TCP Layer"); Assert.AreEqual(tcpLayer, packet.Ethernet.Ip.Tcp.ExtractLayer(), "TCP Layer");
Assert.AreNotEqual(random.NextTcpLayer(), packet.Ethernet.IpV6.Tcp.ExtractLayer(), "TCP Layer"); Assert.AreNotEqual(random.NextTcpLayer(), packet.Ethernet.Ip.Tcp.ExtractLayer(), "TCP Layer");
Assert.AreEqual(tcpLayer.GetHashCode(), packet.Ethernet.IpV6.Tcp.ExtractLayer().GetHashCode(), "TCP Layer"); Assert.AreEqual(tcpLayer.GetHashCode(), packet.Ethernet.Ip.Tcp.ExtractLayer().GetHashCode(), "TCP Layer");
Assert.AreNotEqual(random.NextTcpLayer().GetHashCode(), packet.Ethernet.IpV6.Tcp.ExtractLayer().GetHashCode(), "TCP Layer"); Assert.AreNotEqual(random.NextTcpLayer().GetHashCode(), packet.Ethernet.Ip.Tcp.ExtractLayer().GetHashCode(), "TCP Layer");
Assert.AreEqual(packet.Ethernet.IpV6.Tcp.SequenceNumber + packet.Ethernet.IpV6.Tcp.PayloadLength, packet.Ethernet.IpV6.Tcp.NextSequenceNumber); Assert.AreEqual(packet.Ethernet.Ip.Tcp.SequenceNumber + packet.Ethernet.Ip.Tcp.PayloadLength, packet.Ethernet.Ip.Tcp.NextSequenceNumber);
foreach (TcpOption option in packet.Ethernet.IpV6.Tcp.Options.OptionsCollection) foreach (TcpOption option in packet.Ethernet.Ip.Tcp.Options.OptionsCollection)
{ {
Assert.AreEqual(option, option); Assert.AreEqual(option, option);
Assert.AreEqual(option.GetHashCode(), option.GetHashCode()); Assert.AreEqual(option.GetHashCode(), option.GetHashCode());
...@@ -164,24 +114,24 @@ namespace PcapDotNet.Packets.Test ...@@ -164,24 +114,24 @@ namespace PcapDotNet.Packets.Test
Assert.IsFalse(option.Equals(null)); Assert.IsFalse(option.Equals(null));
Assert.IsFalse(option.Equals(2)); Assert.IsFalse(option.Equals(2));
} }
Assert.AreEqual(tcpLayer.Options, packet.Ethernet.IpV6.Tcp.Options, "Options"); Assert.AreEqual(tcpLayer.Options, packet.Ethernet.Ip.Tcp.Options, "Options");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Acknowledgment) == TcpControlBits.Acknowledgment, packet.Ethernet.IpV6.Tcp.IsAcknowledgment, "IsAcknowledgment"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Acknowledgment) == TcpControlBits.Acknowledgment, packet.Ethernet.Ip.Tcp.IsAcknowledgment, "IsAcknowledgment");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.CongestionWindowReduced) == TcpControlBits.CongestionWindowReduced, packet.Ethernet.IpV6.Tcp.IsCongestionWindowReduced, "IsCongestionWindowReduced"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.CongestionWindowReduced) == TcpControlBits.CongestionWindowReduced, packet.Ethernet.Ip.Tcp.IsCongestionWindowReduced, "IsCongestionWindowReduced");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.ExplicitCongestionNotificationEcho) == TcpControlBits.ExplicitCongestionNotificationEcho, packet.Ethernet.IpV6.Tcp.IsExplicitCongestionNotificationEcho, "IsExplicitCongestionNotificationEcho"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.ExplicitCongestionNotificationEcho) == TcpControlBits.ExplicitCongestionNotificationEcho, packet.Ethernet.Ip.Tcp.IsExplicitCongestionNotificationEcho, "IsExplicitCongestionNotificationEcho");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Fin) == TcpControlBits.Fin, packet.Ethernet.IpV6.Tcp.IsFin, "IsFin"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Fin) == TcpControlBits.Fin, packet.Ethernet.Ip.Tcp.IsFin, "IsFin");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Push) == TcpControlBits.Push, packet.Ethernet.IpV6.Tcp.IsPush, "IsPush"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Push) == TcpControlBits.Push, packet.Ethernet.Ip.Tcp.IsPush, "IsPush");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Reset) == TcpControlBits.Reset, packet.Ethernet.IpV6.Tcp.IsReset, "IsReset"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Reset) == TcpControlBits.Reset, packet.Ethernet.Ip.Tcp.IsReset, "IsReset");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Synchronize) == TcpControlBits.Synchronize, packet.Ethernet.IpV6.Tcp.IsSynchronize, "IsSynchronize"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Synchronize) == TcpControlBits.Synchronize, packet.Ethernet.Ip.Tcp.IsSynchronize, "IsSynchronize");
Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Urgent) == TcpControlBits.Urgent, packet.Ethernet.IpV6.Tcp.IsUrgent, "IsUrgent"); Assert.AreEqual((tcpLayer.ControlBits & TcpControlBits.Urgent) == TcpControlBits.Urgent, packet.Ethernet.Ip.Tcp.IsUrgent, "IsUrgent");
Assert.AreEqual(0, packet.Ethernet.IpV6.Tcp.Reserved); Assert.AreEqual(0, packet.Ethernet.Ip.Tcp.Reserved);
Assert.IsFalse(packet.Ethernet.IpV6.Tcp.IsChecksumOptional, "IsChecksumOptional"); Assert.IsFalse(packet.Ethernet.Ip.Tcp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(TcpDatagram.HeaderMinimumLength + tcpLayer.Options.BytesLength + payloadLayer.Length, packet.Ethernet.IpV6.Tcp.Length, "Total Length"); Assert.AreEqual(TcpDatagram.HeaderMinimumLength + tcpLayer.Options.BytesLength + payloadLayer.Length, packet.Ethernet.Ip.Tcp.Length, "Total Length");
Assert.IsTrue(packet.Ethernet.IpV6.IsTransportChecksumCorrect, "IsTransportChecksumCorrect"); Assert.IsTrue(packet.Ethernet.Ip.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.AreEqual(payloadLayer.Data, packet.Ethernet.IpV6.Tcp.Payload, "Payload"); Assert.AreEqual(payloadLayer.Data, packet.Ethernet.Ip.Tcp.Payload, "Payload");
} }
} }
[TestMethod] [TestMethod]
public void TcpOptionSelectiveAcknowledgmentBlockTest() public void TcpOptionSelectiveAcknowledgmentBlockTest()
{ {
......
...@@ -5,6 +5,7 @@ using PcapDotNet.Packets.IpV4; ...@@ -5,6 +5,7 @@ using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.IpV6; using PcapDotNet.Packets.IpV6;
using PcapDotNet.Packets.TestUtils; using PcapDotNet.Packets.TestUtils;
using PcapDotNet.Packets.Transport; using PcapDotNet.Packets.Transport;
using PcapDotNet.TestUtils;
namespace PcapDotNet.Packets.Test namespace PcapDotNet.Packets.Test
{ {
...@@ -43,7 +44,7 @@ namespace PcapDotNet.Packets.Test ...@@ -43,7 +44,7 @@ namespace PcapDotNet.Packets.Test
#endregion #endregion
[TestMethod] [TestMethod]
public void RandomUdpOverIpV4Test() public void RandomUdpTest()
{ {
EthernetLayer ethernetLayer = new EthernetLayer EthernetLayer ethernetLayer = new EthernetLayer
{ {
...@@ -52,82 +53,55 @@ namespace PcapDotNet.Packets.Test ...@@ -52,82 +53,55 @@ namespace PcapDotNet.Packets.Test
}; };
Random random = new Random(); Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(seed);
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
// TODO: Merge this test with the above one.
for (int i = 0; i != 500; ++i)
{
UdpLayer udpLayer = random.NextUdpLayer();
udpLayer.Checksum = null;
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(60000));
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV4Layer, udpLayer, payloadLayer);
Assert.IsTrue(packet.IsValid, "IsValid");
// Ethernet
ethernetLayer.EtherType = EthernetType.IpV4;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
// IpV4
ipV4Layer.Protocol = IpV4Protocol.Udp;
ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.IpV4.ExtractLayer()).HeaderChecksum;
Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer(), "IP Layer");
ipV4Layer.HeaderChecksum = null;
// UDP
udpLayer.Checksum = packet.Ethernet.IpV4.Udp.Checksum;
Assert.AreEqual(udpLayer, packet.Ethernet.IpV4.Udp.ExtractLayer(), "UDP Layer");
Assert.AreEqual(UdpDatagram.HeaderLength + payloadLayer.Length, packet.Ethernet.IpV4.Udp.TotalLength, "Total Length");
Assert.IsTrue(!udpLayer.CalculateChecksum && packet.Ethernet.IpV4.Udp.Checksum == 0 ||
udpLayer.CalculateChecksum && packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.IsTrue(packet.Ethernet.IpV4.Udp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(payloadLayer.Data, packet.Ethernet.IpV4.Udp.Payload, "Payload");
}
}
[TestMethod]
public void RandomUdpOverIpV6Test()
{
EthernetLayer ethernetLayer = new EthernetLayer
{
Source = new MacAddress("00:01:02:03:04:05"),
Destination = new MacAddress("A0:A1:A2:A3:A4:A5")
};
Random random = new Random();
IpV6Layer ipV6Layer = random.NextIpV6Layer(IpV4Protocol.Udp, false); IpV6Layer ipV6Layer = random.NextIpV6Layer(IpV4Protocol.Udp, false);
for (int i = 0; i != 500; ++i) for (int i = 0; i != 1000; ++i)
{ {
EthernetType ethernetType = random.NextBool() ? EthernetType.IpV4 : EthernetType.IpV6;
Layer ipLayer = (ethernetType == EthernetType.IpV4 ? (Layer)ipV4Layer : ipV6Layer);
UdpLayer udpLayer = random.NextUdpLayer(); UdpLayer udpLayer = random.NextUdpLayer();
udpLayer.Checksum = null; udpLayer.Checksum = null;
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(60000)); PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(60000));
Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV6Layer, udpLayer, payloadLayer); Packet packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, ipLayer, udpLayer, payloadLayer);
Assert.IsTrue(packet.IsValid, "IsValid"); Assert.IsTrue(packet.IsValid, "IsValid");
// Ethernet // Ethernet
ethernetLayer.EtherType = EthernetType.IpV6; ethernetLayer.EtherType = ethernetType;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer"); Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
ethernetLayer.EtherType = EthernetType.None;
// IpV6
Assert.AreEqual(ipV6Layer, packet.Ethernet.IpV6.ExtractLayer(), "IP Layer"); // Ip
if (ipLayer == ipV4Layer)
{
// IpV4.
ipV4Layer.Protocol = IpV4Protocol.Udp;
ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.IpV4.ExtractLayer()).HeaderChecksum;
Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer(), "IP Layer");
ipV4Layer.HeaderChecksum = null;
}
else
{
// IpV6.
Assert.AreEqual(ipV6Layer, packet.Ethernet.IpV6.ExtractLayer(), "IP Layer");
}
// UDP // UDP
udpLayer.Checksum = packet.Ethernet.IpV6.Udp.Checksum; udpLayer.Checksum = packet.Ethernet.Ip.Udp.Checksum;
Assert.AreEqual(udpLayer, packet.Ethernet.IpV6.Udp.ExtractLayer(), "UDP Layer"); Assert.AreEqual(udpLayer, packet.Ethernet.Ip.Udp.ExtractLayer(), "UDP Layer");
Assert.AreEqual(UdpDatagram.HeaderLength + payloadLayer.Length, packet.Ethernet.IpV6.Udp.TotalLength, "Total Length"); Assert.AreEqual(UdpDatagram.HeaderLength + payloadLayer.Length, packet.Ethernet.Ip.Udp.TotalLength, "Total Length");
Assert.IsTrue(!udpLayer.CalculateChecksum && packet.Ethernet.IpV6.Udp.Checksum == 0 || Assert.IsTrue(!udpLayer.CalculateChecksum && packet.Ethernet.Ip.Udp.Checksum == 0 ||
udpLayer.CalculateChecksum && packet.Ethernet.IpV6.IsTransportChecksumCorrect, "IsTransportChecksumCorrect"); udpLayer.CalculateChecksum && packet.Ethernet.Ip.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.IsTrue(packet.Ethernet.IpV6.Udp.IsChecksumOptional, "IsChecksumOptional"); Assert.IsTrue(packet.Ethernet.Ip.Udp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(payloadLayer.Data, packet.Ethernet.IpV6.Udp.Payload, "Payload"); Assert.AreEqual(payloadLayer.Data, packet.Ethernet.Ip.Udp.Payload, "Payload");
} }
} }
......
...@@ -40,7 +40,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -40,7 +40,7 @@ namespace PcapDotNet.Packets.TestUtils
public static IpV6Layer NextIpV6Layer(this Random random, IpV4Protocol? lastNextHeader, bool allowEncapsulatingSecurityPayload) public static IpV6Layer NextIpV6Layer(this Random random, IpV4Protocol? lastNextHeader, bool allowEncapsulatingSecurityPayload)
{ {
IpV6ExtensionHeaders extensionHeaders = random.NextIpV6ExtensionHeaders(random.NextInt(0, 10), lastNextHeader, allowEncapsulatingSecurityPayload); IpV6ExtensionHeaders extensionHeaders = random.NextIpV6ExtensionHeaders(random.NextInt(0, 10), lastNextHeader, allowEncapsulatingSecurityPayload);
IpV4Protocol nextHeader = extensionHeaders.FirstHeader ?? (lastNextHeader ?? random.NextEnum<IpV4Protocol>(IpV6ExtensionHeader.ExtensionHeaders)); IpV4Protocol? nextHeader = extensionHeaders.FirstHeader ?? lastNextHeader;
return new IpV6Layer return new IpV6Layer
{ {
TrafficClass = random.NextByte(), TrafficClass = random.NextByte(),
......
using PcapDotNet.Packets.Arp; using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Ip;
using PcapDotNet.Packets.IpV4; using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.IpV6; using PcapDotNet.Packets.IpV6;
...@@ -96,8 +97,6 @@ namespace PcapDotNet.Packets.Ethernet ...@@ -96,8 +97,6 @@ namespace PcapDotNet.Packets.Ethernet
get { return PayloadDatagrams.VLanTaggedFrame; } get { return PayloadDatagrams.VLanTaggedFrame; }
} }
// TODO: Add Ip property.
/// <summary> /// <summary>
/// The Ethernet payload as an IPv4 datagram. /// The Ethernet payload as an IPv4 datagram.
/// </summary> /// </summary>
...@@ -113,6 +112,24 @@ namespace PcapDotNet.Packets.Ethernet ...@@ -113,6 +112,24 @@ namespace PcapDotNet.Packets.Ethernet
{ {
get { return PayloadDatagrams.IpV6; } get { return PayloadDatagrams.IpV6; }
} }
public IpDatagram Ip
{
get
{
switch (EtherType)
{
case EthernetType.IpV4:
return IpV4;
case EthernetType.IpV6:
return IpV6;
default:
return null;
}
}
}
/// <summary> /// <summary>
/// The Ethernet payload as an ARP datagram. /// The Ethernet payload as an ARP datagram.
......
...@@ -119,6 +119,24 @@ namespace PcapDotNet.Packets.Ip ...@@ -119,6 +119,24 @@ namespace PcapDotNet.Packets.Ip
} }
} }
public IpDatagram Ip
{
get
{
switch (PayloadProtocol)
{
case IpV4Protocol.Ip:
return IpV4;
case IpV4Protocol.IpV6:
return IpV6;
default:
return null;
}
}
}
/// <summary> /// <summary>
/// The payload of the datagram as an ICMP datagram. /// The payload of the datagram as an ICMP datagram.
/// </summary> /// </summary>
...@@ -233,6 +251,37 @@ namespace PcapDotNet.Packets.Ip ...@@ -233,6 +251,37 @@ namespace PcapDotNet.Packets.Ip
{ {
} }
internal bool IsPayloadValid
{
get
{
switch (PayloadProtocol)
{
case IpV4Protocol.Ip:
case IpV4Protocol.IpV6:
return Ip.IsValid;
case IpV4Protocol.Tcp:
case IpV4Protocol.Udp:
return Transport.IsValid && (Transport.IsChecksumOptional && Transport.Checksum == 0 ||
IsTransportChecksumCorrect);
case IpV4Protocol.InternetGroupManagementProtocol:
return Igmp.IsValid;
case IpV4Protocol.InternetControlMessageProtocol:
return Icmp.IsValid;
case IpV4Protocol.Gre:
return Gre.IsValid;
default:
// Todo check more protocols
return true;
}
}
}
internal abstract IpV4Protocol PayloadProtocol { get; } internal abstract IpV4Protocol PayloadProtocol { get; }
internal abstract DataSegment GetPayload(); internal abstract DataSegment GetPayload();
......
...@@ -311,26 +311,7 @@ namespace PcapDotNet.Packets.IpV4 ...@@ -311,26 +311,7 @@ namespace PcapDotNet.Packets.IpV4
if (!IsHeaderChecksumCorrect) if (!IsHeaderChecksumCorrect)
return false; return false;
switch (Protocol) return IsPayloadValid;
{
case IpV4Protocol.Tcp:
case IpV4Protocol.Udp:
return Transport.IsValid && (Transport.IsChecksumOptional && Transport.Checksum == 0 ||
IsTransportChecksumCorrect);
case IpV4Protocol.InternetGroupManagementProtocol:
return Igmp.IsValid;
case IpV4Protocol.InternetControlMessageProtocol:
return Icmp.IsValid;
case IpV4Protocol.Gre:
return Gre.IsValid;
default:
// Todo check more protocols
return true;
}
} }
protected override ushort CalculateTransportChecksum() protected override ushort CalculateTransportChecksum()
......
...@@ -187,12 +187,15 @@ namespace PcapDotNet.Packets.IpV6 ...@@ -187,12 +187,15 @@ namespace PcapDotNet.Packets.IpV6
} }
/// <summary> /// <summary>
/// Valid if all extension headers are valid. /// Valid if all extension headers are valid and payload is valid.
/// </summary> /// </summary>
protected override bool CalculateIsValid() protected override bool CalculateIsValid()
{ {
ParseExtensionHeaders(); ParseExtensionHeaders();
return _isValid; if (!_isValidExtensionHeaders)
return false;
return IsPayloadValid;
} }
protected override ushort CalculateTransportChecksum() protected override ushort CalculateTransportChecksum()
...@@ -269,12 +272,12 @@ namespace PcapDotNet.Packets.IpV6 ...@@ -269,12 +272,12 @@ namespace PcapDotNet.Packets.IpV6
if (Length < HeaderLength) if (Length < HeaderLength)
{ {
_isValid = false; _isValidExtensionHeaders = false;
_extensionHeaders = IpV6ExtensionHeaders.Empty; _extensionHeaders = IpV6ExtensionHeaders.Empty;
return; return;
} }
_extensionHeaders = new IpV6ExtensionHeaders(Subsegment(HeaderLength, RealPayloadLength), NextHeader); _extensionHeaders = new IpV6ExtensionHeaders(Subsegment(HeaderLength, RealPayloadLength), NextHeader);
_isValid = _isValid && _extensionHeaders.IsValid; _isValidExtensionHeaders = _isValidExtensionHeaders && _extensionHeaders.IsValid;
} }
private static ushort CalculateTransportChecksum(byte[] buffer, int offset, int fullHeaderLength, uint transportLength, int transportChecksumOffset, bool isChecksumOptional, IpV6Address destination) private static ushort CalculateTransportChecksum(byte[] buffer, int offset, int fullHeaderLength, uint transportLength, int transportChecksumOffset, bool isChecksumOptional, IpV6Address destination)
...@@ -293,6 +296,6 @@ namespace PcapDotNet.Packets.IpV6 ...@@ -293,6 +296,6 @@ namespace PcapDotNet.Packets.IpV6
} }
private IpV6ExtensionHeaders _extensionHeaders; private IpV6ExtensionHeaders _extensionHeaders;
private bool _isValid = true; private bool _isValidExtensionHeaders = true;
} }
} }
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