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
IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(true);
UdpLayer udpLayer = random.NextUdpLayer();
udpLayer.Checksum = null;
......@@ -73,19 +74,19 @@ namespace PcapDotNet.Packets.Test
dnsLayer = random.NextDnsLayer();
} 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");
// 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.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);
Assert.AreEqual(opt, packet.Ethernet.IpV4.Udp.Dns.OptionsRecord);
DnsDataResourceRecord opt = packet.Ethernet.Ip.Udp.Dns.Additionals.FirstOrDefault(additional => additional.DnsType == DnsType.Opt);
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.DomainName.Equals((object)record.DomainName));
......@@ -93,7 +94,7 @@ namespace PcapDotNet.Packets.Test
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);
Assert.IsTrue(record.Equals((object)record));
......
......@@ -55,41 +55,55 @@ namespace PcapDotNet.Packets.Test
};
Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(seed);
IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(IpV4Protocol.Gre, false);
for (int i = 0; i != 200; ++i)
{
GreLayer greLayer = random.NextGreLayer();
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);
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
ethernetLayer.EtherType = EthernetType.IpV4;
ethernetLayer.EtherType = ipLayer == ipV4Layer ? EthernetType.IpV4 : EthernetType.IpV6;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
ethernetLayer.EtherType = EthernetType.None;
// IPv4
ipV4Layer.Protocol = IpV4Protocol.Gre;
ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.IpV4.ExtractLayer()).HeaderChecksum;
Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer());
ipV4Layer.HeaderChecksum = null;
Assert.AreEqual(ipV4Layer.Length, packet.Ethernet.IpV4.HeaderLength);
Assert.IsTrue(packet.Ethernet.IpV4.IsHeaderChecksumCorrect);
Assert.AreEqual(ipV4Layer.Length + greLayer.Length + payloadLayer.Length,
packet.Ethernet.IpV4.TotalLength);
Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.IpV4.Version);
// IP.
if (ipLayer == ipV4Layer)
{
// IPv4.
ipV4Layer.Protocol = IpV4Protocol.Gre;
ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.Ip.ExtractLayer()).HeaderChecksum;
Assert.AreEqual(ipV4Layer, packet.Ethernet.Ip.ExtractLayer());
ipV4Layer.HeaderChecksum = null;
Assert.AreEqual(ipV4Layer.Length, packet.Ethernet.IpV4.HeaderLength);
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
GreDatagram actualGre = packet.Ethernet.IpV4.Gre;
GreDatagram actualGre = packet.Ethernet.Ip.Gre;
GreLayer actualGreLayer = (GreLayer)actualGre.ExtractLayer();
if (greLayer.ChecksumPresent && greLayer.Checksum == null)
{
......@@ -204,11 +218,15 @@ namespace PcapDotNet.Packets.Test
};
Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(seed);
for (int i = 0; i != 100; ++i)
{
IpV4Layer ipV4Layer = random.NextIpV4Layer(IpV4Protocol.Gre);
ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(IpV4Protocol.Gre, false);
GreLayer greLayer = random.NextGreLayer();
greLayer.Checksum = null;
......@@ -219,26 +237,26 @@ namespace PcapDotNet.Packets.Test
0)
}.AsReadOnly();
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer);
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipLayer, greLayer);
Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid ||
new[] { EthernetType.IpV4, EthernetType.IpV6, EthernetType.Arp, EthernetType.VLanTaggedFrame }.Contains(greLayer.ProtocolType),
"IsValid. ProtoclType=" + greLayer.ProtocolType);
GreDatagram gre = packet.Ethernet.IpV4.Gre;
GreDatagram gre = packet.Ethernet.Ip.Gre;
// Remove a byte from routing
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);
Assert.IsNull(packet.Ethernet.IpV4.Gre.Payload);
Assert.IsNull(packet.Ethernet.Ip.Gre.Payload);
Assert.IsFalse(packet.IsValid);
// SreLength is too big
byte[] buffer = gre.ToArray();
buffer[buffer.Length - 1] = 200;
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);
Assert.IsFalse(packet.IsValid);
......@@ -246,7 +264,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray();
buffer[gre.Length - 10] = 100;
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);
Assert.IsFalse(packet.IsValid);
......@@ -254,7 +272,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray();
buffer[gre.Length - 10] = 3;
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);
Assert.IsFalse(packet.IsValid);
......@@ -262,7 +280,7 @@ namespace PcapDotNet.Packets.Test
buffer = gre.ToArray();
buffer[gre.Length - 16] = 1;
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);
Assert.IsFalse(packet.IsValid);
}
......
......@@ -52,21 +52,25 @@ namespace PcapDotNet.Packets.Test
[TestMethod]
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)
{
EthernetLayer ethernetLayer = random.NextEthernetLayer(EthernetType.None);
IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
Layer ipLayer = random.NextBool() ? (Layer)ipV4Layer : random.NextIpV6Layer(true);
TcpLayer tcpLayer = random.NextTcpLayer();
tcpLayer.Checksum = null;
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");
HttpDatagram httpDatagram = packet.Ethernet.IpV4.Tcp.Http;
HttpDatagram httpDatagram = packet.Ethernet.Ip.Tcp.Http;
Assert.AreEqual(httpLayer.Version, httpDatagram.Version);
if (httpLayer.Version != null)
Assert.AreEqual(httpLayer.Version.GetHashCode(), httpDatagram.Version.GetHashCode());
......@@ -76,7 +80,7 @@ namespace PcapDotNet.Packets.Test
Assert.IsTrue(httpLayer.IsRequest);
Assert.IsFalse(httpDatagram.IsResponse);
Assert.IsFalse(httpLayer.IsResponse);
HttpRequestLayer httpRequestLayer = (HttpRequestLayer)httpLayer;
HttpRequestDatagram httpRequestDatagram = (HttpRequestDatagram)httpDatagram;
Assert.AreEqual(httpRequestLayer.Method, httpRequestDatagram.Method);
......
......@@ -102,7 +102,9 @@ namespace PcapDotNet.Packets.Test
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.InternetGroupManagementProtocol ||
ipV4Layer.Protocol == IpV4Protocol.InternetControlMessageProtocol ||
......
......@@ -67,6 +67,9 @@ namespace PcapDotNet.Packets.Test
};
Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(1930237499);
for (int i = 0; i != 1000; ++i)
{
......@@ -74,12 +77,22 @@ namespace PcapDotNet.Packets.Test
PayloadLayer payloadLayer = random.NextPayloadLayer(random.NextInt(0, 50 * 1024));
if (i < 26)
continue;
List<ILayer> layers = new List<ILayer> {ethernetLayer, ipV6Layer};
if (ipV6Layer.ExtensionHeaders.LastHeader != IpV4Protocol.EncapsulatingSecurityPayload)
layers.Add(payloadLayer);
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
Assert.AreEqual(packet.Length - EthernetDatagram.HeaderLengthValue, packet.Ethernet.PayloadLength, "PayloadLength");
......
......@@ -5,6 +5,7 @@ using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.IpV6;
using PcapDotNet.Packets.TestUtils;
using PcapDotNet.Packets.Transport;
using PcapDotNet.TestUtils;
namespace PcapDotNet.Packets.Test
{
......@@ -43,7 +44,7 @@ namespace PcapDotNet.Packets.Test
#endregion
[TestMethod]
public void RandomUdpOverIpV4Test()
public void RandomUdpTest()
{
EthernetLayer ethernetLayer = new EthernetLayer
{
......@@ -52,82 +53,55 @@ namespace PcapDotNet.Packets.Test
};
Random random = new Random();
int seed = random.Next();
Console.WriteLine("Seed: " + seed);
random = new Random(seed);
IpV4Layer ipV4Layer = random.NextIpV4Layer(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);
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.Checksum = null;
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");
// Ethernet
ethernetLayer.EtherType = EthernetType.IpV6;
ethernetLayer.EtherType = ethernetType;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
// IpV6
Assert.AreEqual(ipV6Layer, packet.Ethernet.IpV6.ExtractLayer(), "IP Layer");
ethernetLayer.EtherType = EthernetType.None;
// 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
udpLayer.Checksum = packet.Ethernet.IpV6.Udp.Checksum;
Assert.AreEqual(udpLayer, packet.Ethernet.IpV6.Udp.ExtractLayer(), "UDP Layer");
Assert.AreEqual(UdpDatagram.HeaderLength + payloadLayer.Length, packet.Ethernet.IpV6.Udp.TotalLength, "Total Length");
Assert.IsTrue(!udpLayer.CalculateChecksum && packet.Ethernet.IpV6.Udp.Checksum == 0 ||
udpLayer.CalculateChecksum && packet.Ethernet.IpV6.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.IsTrue(packet.Ethernet.IpV6.Udp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(payloadLayer.Data, packet.Ethernet.IpV6.Udp.Payload, "Payload");
udpLayer.Checksum = packet.Ethernet.Ip.Udp.Checksum;
Assert.AreEqual(udpLayer, packet.Ethernet.Ip.Udp.ExtractLayer(), "UDP Layer");
Assert.AreEqual(UdpDatagram.HeaderLength + payloadLayer.Length, packet.Ethernet.Ip.Udp.TotalLength, "Total Length");
Assert.IsTrue(!udpLayer.CalculateChecksum && packet.Ethernet.Ip.Udp.Checksum == 0 ||
udpLayer.CalculateChecksum && packet.Ethernet.Ip.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.IsTrue(packet.Ethernet.Ip.Udp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(payloadLayer.Data, packet.Ethernet.Ip.Udp.Payload, "Payload");
}
}
......
......@@ -40,7 +40,7 @@ namespace PcapDotNet.Packets.TestUtils
public static IpV6Layer NextIpV6Layer(this Random random, IpV4Protocol? lastNextHeader, bool 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
{
TrafficClass = random.NextByte(),
......
using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Ip;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.IpV6;
......@@ -96,8 +97,6 @@ namespace PcapDotNet.Packets.Ethernet
get { return PayloadDatagrams.VLanTaggedFrame; }
}
// TODO: Add Ip property.
/// <summary>
/// The Ethernet payload as an IPv4 datagram.
/// </summary>
......@@ -113,6 +112,24 @@ namespace PcapDotNet.Packets.Ethernet
{
get { return PayloadDatagrams.IpV6; }
}
public IpDatagram Ip
{
get
{
switch (EtherType)
{
case EthernetType.IpV4:
return IpV4;
case EthernetType.IpV6:
return IpV6;
default:
return null;
}
}
}
/// <summary>
/// The Ethernet payload as an ARP datagram.
......
......@@ -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>
/// The payload of the datagram as an ICMP datagram.
/// </summary>
......@@ -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 DataSegment GetPayload();
......
......@@ -311,26 +311,7 @@ namespace PcapDotNet.Packets.IpV4
if (!IsHeaderChecksumCorrect)
return false;
switch (Protocol)
{
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;
}
return IsPayloadValid;
}
protected override ushort CalculateTransportChecksum()
......
......@@ -187,12 +187,15 @@ namespace PcapDotNet.Packets.IpV6
}
/// <summary>
/// Valid if all extension headers are valid.
/// Valid if all extension headers are valid and payload is valid.
/// </summary>
protected override bool CalculateIsValid()
{
ParseExtensionHeaders();
return _isValid;
if (!_isValidExtensionHeaders)
return false;
return IsPayloadValid;
}
protected override ushort CalculateTransportChecksum()
......@@ -269,12 +272,12 @@ namespace PcapDotNet.Packets.IpV6
if (Length < HeaderLength)
{
_isValid = false;
_isValidExtensionHeaders = false;
_extensionHeaders = IpV6ExtensionHeaders.Empty;
return;
}
_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)
......@@ -293,6 +296,6 @@ namespace PcapDotNet.Packets.IpV6
}
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