Commit a2b06200 authored by Brickner_cp's avatar Brickner_cp

Better comparison to Wireshark.

Improved Ethernet FCS.
parent cdf717f9
...@@ -2,6 +2,7 @@ using System; ...@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using PcapDotNet.Base;
using PcapDotNet.Core.Extensions; using PcapDotNet.Core.Extensions;
using PcapDotNet.Packets; using PcapDotNet.Packets;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
...@@ -160,7 +161,7 @@ namespace PcapDotNet.Core.Test ...@@ -160,7 +161,7 @@ namespace PcapDotNet.Core.Test
TestReceivePackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0, 0.02); TestReceivePackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0, 0.02);
// Wait for more packets // Wait for more packets
TestReceivePackets(NumPacketsToSend, 0, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.071); TestReceivePackets(NumPacketsToSend, 0, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.14);
TestReceivePackets(NumPacketsToSend, -1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.3); TestReceivePackets(NumPacketsToSend, -1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.3);
TestReceivePackets(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.051); TestReceivePackets(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.051);
...@@ -570,30 +571,30 @@ namespace PcapDotNet.Core.Test ...@@ -570,30 +571,30 @@ namespace PcapDotNet.Core.Test
communicator.SetSamplingMethod(new SamplingMethodFirstAfterInterval(TimeSpan.FromSeconds(1))); communicator.SetSamplingMethod(new SamplingMethodFirstAfterInterval(TimeSpan.FromSeconds(1)));
int numPacketsGot; int numPacketsGot;
communicator.ReceiveSomePackets(out numPacketsGot, 100, p => { }); communicator.ReceiveSomePackets(out numPacketsGot, 100, p => { });
Packet expectedPacket = _random.NextEthernetPacket(60, sourceMac, destinationMac);
Packet[] packetsToSend = new Packet[11];
packetsToSend[0] = _random.NextEthernetPacket(60, sourceMac, destinationMac);
for (int i = 0; i != 10; ++i)
packetsToSend[i + 1] = _random.NextEthernetPacket(60 * (i + 2), sourceMac, destinationMac);
List<Packet> packets = new List<Packet>(6); List<Packet> packets = new List<Packet>(6);
Thread thread = new Thread(() => packets.AddRange(communicator.ReceivePackets(6))); Thread thread = new Thread(() => packets.AddRange(communicator.ReceivePackets(6)));
thread.Start(); thread.Start();
communicator.SendPacket(expectedPacket);
Thread.Sleep(TimeSpan.FromSeconds(0.75)); communicator.SendPacket(packetsToSend[0]);
Thread.Sleep(TimeSpan.FromSeconds(0.7));
for (int i = 0; i != 10; ++i) for (int i = 0; i != 10; ++i)
{ {
expectedPacket = _random.NextEthernetPacket(60 * (i + 2), sourceMac, destinationMac); communicator.SendPacket(packetsToSend[i + 1]);
communicator.SendPacket(expectedPacket); Thread.Sleep(TimeSpan.FromSeconds(0.55));
Thread.Sleep(TimeSpan.FromSeconds(0.5));
} }
if (!thread.Join(TimeSpan.FromSeconds(10))) if (!thread.Join(TimeSpan.FromSeconds(10)))
thread.Abort(); thread.Abort();
Assert.AreEqual(6, packets.Count); Assert.AreEqual(6, packets.Count, packets.Select(p => (p.Timestamp-packets[0].Timestamp).TotalSeconds + "(" + p.Length + ")").SequenceToString(", "));
Packet packet; Packet packet;
for (int i = 0; i != 6; ++i) for (int i = 0; i != 6; ++i)
{
// result = communicator.ReceivePacket(out packet);
// Assert.AreEqual(PacketCommunicatorReceiveResult.Ok, result);
// Assert.AreEqual(60 * (i * 2 + 1), packet.Length, i.ToString());
Assert.AreEqual(60 * (i * 2 + 1), packets[i].Length, i.ToString()); Assert.AreEqual(60 * (i * 2 + 1), packets[i].Length, i.ToString());
}
PacketCommunicatorReceiveResult result = communicator.ReceivePacket(out packet); PacketCommunicatorReceiveResult result = communicator.ReceivePacket(out packet);
Assert.AreEqual(PacketCommunicatorReceiveResult.Timeout, result); Assert.AreEqual(PacketCommunicatorReceiveResult.Timeout, result);
Assert.IsNull(packet); Assert.IsNull(packet);
......
...@@ -213,7 +213,7 @@ namespace PcapDotNet.Core.Test ...@@ -213,7 +213,7 @@ namespace PcapDotNet.Core.Test
} }
else else
{ {
const byte RetryNumber = 244; const byte RetryNumber = 89;
pcapFilename = Path.GetTempPath() + "temp." + RetryNumber + ".pcap"; pcapFilename = Path.GetTempPath() + "temp." + RetryNumber + ".pcap";
List<Packet> packetsList = new List<Packet>(); List<Packet> packetsList = new List<Packet>();
new OfflinePacketDevice(pcapFilename).Open().ReceivePackets(1000, packetsList.Add); new OfflinePacketDevice(pcapFilename).Open().ReceivePackets(1000, packetsList.Add);
...@@ -630,6 +630,7 @@ namespace PcapDotNet.Core.Test ...@@ -630,6 +630,7 @@ namespace PcapDotNet.Core.Test
field.Show().StartsWith("Stream identifier (with option length = ") || field.Show().StartsWith("Stream identifier (with option length = ") ||
field.Show().Contains("with too") || field.Show().Contains("with too") ||
field.Show().Contains(" bytes says option goes past end of options") || field.Show().Contains(" bytes says option goes past end of options") ||
field.Show().Contains("(length byte past end of options)") ||
field.Fields().First().Show().StartsWith("Pointer: ") && field.Fields().First().Show().EndsWith(" (points to middle of address)") || field.Fields().First().Show().StartsWith("Pointer: ") && field.Fields().First().Show().EndsWith(" (points to middle of address)") ||
field.Fields().Where(value => value.Show() == "(suboption would go past end of option)").Count() != 0, field.Show()); field.Fields().Where(value => value.Show() == "(suboption would go past end of option)").Count() != 0, field.Show());
break; break;
...@@ -803,15 +804,28 @@ namespace PcapDotNet.Core.Test ...@@ -803,15 +804,28 @@ namespace PcapDotNet.Core.Test
break; break;
case "data": case "data":
field.AssertValue(((IcmpIpV4HeaderPlus64BitsPayloadDatagram)icmpDatagram).IpV4.Payload); var casted1 = icmpDatagram as IcmpIpV4HeaderPlus64BitsPayloadDatagram;
if (casted1 != null)
field.AssertValue(casted1.IpV4.Payload);
else
field.AssertValue(icmpDatagram.Payload);
break; break;
case "data.data": case "data.data":
field.AssertShow(((IcmpIpV4HeaderPlus64BitsPayloadDatagram)icmpDatagram).IpV4.Payload); var casted2 = icmpDatagram as IcmpIpV4HeaderPlus64BitsPayloadDatagram;
if (casted2 != null)
field.AssertShow(casted2.IpV4.Payload);
else
field.AssertShow(icmpDatagram.Payload);
break; break;
case "data.len": case "data.len":
field.AssertShowDecimal(((IcmpIpV4HeaderPlus64BitsPayloadDatagram)icmpDatagram).IpV4.Payload.Length); var casted3 = icmpDatagram as IcmpIpV4HeaderPlus64BitsPayloadDatagram;
if (casted3 != null)
field.AssertShowDecimal(casted3.IpV4.Payload.Length);
else
field.AssertShowDecimal(icmpDatagram.Payload.Length);
break; break;
case "": case "":
...@@ -929,10 +943,15 @@ namespace PcapDotNet.Core.Test ...@@ -929,10 +943,15 @@ namespace PcapDotNet.Core.Test
(greDatagram.RoutingPresent ? "Routing" : "No routing"))); (greDatagram.RoutingPresent ? "Routing" : "No routing")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("..{0}. .... .... .... = {1}", greDatagram.KeyPresent.ToInt(), innerFields[currentInnerFieldIndex++].AssertShow(string.Format("..{0}. .... .... .... = {1}", greDatagram.KeyPresent.ToInt(),
(greDatagram.KeyPresent ? "Key" : "No key"))); (greDatagram.KeyPresent ? "Key" : "No key")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("...{0} .... .... .... = {1}", greDatagram.SequenceNumberPresent.ToInt(), innerFields[currentInnerFieldIndex++].AssertShow(string.Format("...{0} .... .... .... = {1}",
(greDatagram.SequenceNumberPresent ? "Sequence number" : "No sequence number"))); greDatagram.SequenceNumberPresent.ToInt(),
(greDatagram.SequenceNumberPresent
? "Sequence number"
: "No sequence number")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... {0}... .... .... = {1}", greDatagram.StrictSourceRoute.ToInt(), innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... {0}... .... .... = {1}", greDatagram.StrictSourceRoute.ToInt(),
(greDatagram.StrictSourceRoute ? "Strict source route" : "No strict source route"))); (greDatagram.StrictSourceRoute
? "Strict source route"
: "No strict source route")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .{0} .... .... = Recursion control: {1}", innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .{0} .... .... = Recursion control: {1}",
greDatagram.RecursionControl.ToBits().Skip(5).Select(b => b.ToInt()). greDatagram.RecursionControl.ToBits().Skip(5).Select(b => b.ToInt()).
SequenceToString(), SequenceToString(),
...@@ -946,7 +965,8 @@ namespace PcapDotNet.Core.Test ...@@ -946,7 +965,8 @@ namespace PcapDotNet.Core.Test
: "No acknowledgment number"))); : "No acknowledgment number")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .... .{0}... = Flags: {1}", innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .... .{0}... = Flags: {1}",
greDatagram.FutureUseBits.ToBits().Skip(3).Take(4).Select(b => b.ToInt()). greDatagram.FutureUseBits.ToBits().Skip(3).Take(4).Select(
b => b.ToInt()).
SequenceToString(). SequenceToString().
Insert(3, " "), Insert(3, " "),
greDatagram.FutureUseBits)); greDatagram.FutureUseBits));
...@@ -1022,19 +1042,21 @@ namespace PcapDotNet.Core.Test ...@@ -1022,19 +1042,21 @@ namespace PcapDotNet.Core.Test
case "data": case "data":
case "data.data": case "data.data":
if (greDatagram.Version != GreVersion.EnhancedGre && if (greDatagram.AcknowledgmentSequenceNumberPresent &&
greDatagram.AcknowledgmentSequenceNumberPresent) (greDatagram.Version != GreVersion.EnhancedGre || !greDatagram.SequenceNumberPresent))
{ {
Assert.AreEqual(field.Value().Skip(8).SequenceToString(), greDatagram.Payload.BytesSequenceToHexadecimalString(), "GRE data.data"); Assert.AreEqual(field.Value().Skip(8).SequenceToString(), greDatagram.Payload.BytesSequenceToHexadecimalString(), "GRE data.data");
} }
else else
{
field.AssertValue(greDatagram.Payload, "GRE data.data"); field.AssertValue(greDatagram.Payload, "GRE data.data");
}
break; break;
case "data.len": case "data.len":
field.AssertShowDecimal( field.AssertShowDecimal(
greDatagram.Payload.Length + (greDatagram.Version != GreVersion.EnhancedGre && greDatagram.Payload.Length + (greDatagram.AcknowledgmentSequenceNumberPresent &&
greDatagram.AcknowledgmentSequenceNumberPresent (greDatagram.Version != GreVersion.EnhancedGre || !greDatagram.SequenceNumberPresent)
? 4 ? 4
: 0), "GRE data.len"); : 0), "GRE data.len");
break; break;
...@@ -1234,9 +1256,15 @@ namespace PcapDotNet.Core.Test ...@@ -1234,9 +1256,15 @@ namespace PcapDotNet.Core.Test
{ {
if (currentOptionIndex >= options.Count) if (currentOptionIndex >= options.Count)
{ {
Assert.IsFalse(options.IsValid); Assert.IsFalse(options.IsValid, "Options IsValid");
Assert.IsTrue(field.Show().Contains("bytes says option goes past end of options")); // if (field.Show().StartsWith("Unknown ("))
Assert.AreEqual(options.Count, currentOptionIndex); // {
// int.Parse()
// }
Assert.IsTrue(
// field.Show().StartsWith("Unknown (") || // Unknown in Wireshark but known (and invalid) in Pcap.Net
field.Show().Contains("bytes says option goes past end of options"), "Options show: " + field.Show());
Assert.AreEqual(options.Count, currentOptionIndex, "Options Count");
return; return;
} }
......
...@@ -129,7 +129,7 @@ namespace PcapDotNet.Packets.Ethernet ...@@ -129,7 +129,7 @@ namespace PcapDotNet.Packets.Ethernet
if (payloadByEtherType == null) if (payloadByEtherType == null)
return null; return null;
if (Length - payloadByEtherType.Length >= 4 && Length >= 68) if (Length - HeaderLength - payloadByEtherType.Length >= 4 && Length >= 68)
return new Datagram(Buffer, Length - 4, 4); return new Datagram(Buffer, Length - 4, 4);
return null; return null;
} }
......
...@@ -11,21 +11,21 @@ namespace PcapDotNet.TestUtils ...@@ -11,21 +11,21 @@ namespace PcapDotNet.TestUtils
public static void IsBigger<T>(T expectedMinimum, T actual) where T : IComparable<T> public static void IsBigger<T>(T expectedMinimum, T actual) where T : IComparable<T>
{ {
if (expectedMinimum.CompareTo(actual) >= 0) if (expectedMinimum.CompareTo(actual) >= 0)
throw new AssertFailedException("Assert.IsBigger failed. Expected minimum: <" + expectedMinimum + throw new AssertFailedException("MoreAssert.IsBigger failed. Expected minimum: <" + expectedMinimum +
"> Actual: <" + actual + ">."); "> Actual: <" + actual + ">.");
} }
public static void IsSmaller<T>(T expectedMaximum, T actual) where T : IComparable<T> public static void IsSmaller<T>(T expectedMaximum, T actual) where T : IComparable<T>
{ {
if (expectedMaximum.CompareTo(actual) <= 0) if (expectedMaximum.CompareTo(actual) <= 0)
throw new AssertFailedException("Assert.IsSmaller failed. Expected maximum: <" + expectedMaximum + throw new AssertFailedException("MoreAssert.IsSmaller failed. Expected maximum: <" + expectedMaximum +
"> Actual: <" + actual + ">."); "> Actual: <" + actual + ">.");
} }
public static void IsBiggerOrEqual<T>(T expectedMinimum, T actual, string message) where T : IComparable<T> public static void IsBiggerOrEqual<T>(T expectedMinimum, T actual, string message) where T : IComparable<T>
{ {
if (expectedMinimum.CompareTo(actual) > 0) if (expectedMinimum.CompareTo(actual) > 0)
throw new AssertFailedException("Assert.IsBiggerOrEqual failed. Expected minimum: <" + expectedMinimum + throw new AssertFailedException("MoreAssert.IsBiggerOrEqual failed. Expected minimum: <" + expectedMinimum +
"> Actual: <" + actual + ">. " + message); "> Actual: <" + actual + ">. " + message);
} }
...@@ -37,7 +37,7 @@ namespace PcapDotNet.TestUtils ...@@ -37,7 +37,7 @@ namespace PcapDotNet.TestUtils
public static void IsSmallerOrEqual<T>(T expectedMaximum, T actual, string message) where T : IComparable<T> public static void IsSmallerOrEqual<T>(T expectedMaximum, T actual, string message) where T : IComparable<T>
{ {
if (expectedMaximum.CompareTo(actual) < 0) if (expectedMaximum.CompareTo(actual) < 0)
throw new AssertFailedException("Assert.IsSmallerOrEqual failed. Expected maximum: <" + expectedMaximum + throw new AssertFailedException("MoreAssert.IsSmallerOrEqual failed. Expected maximum: <" + expectedMaximum +
"> Actual: <" + actual + ">. " + message); "> Actual: <" + actual + ">. " + message);
} }
...@@ -57,6 +57,13 @@ namespace PcapDotNet.TestUtils ...@@ -57,6 +57,13 @@ namespace PcapDotNet.TestUtils
IsInRange(expectedMinimum, expectedMaximum, actual, string.Empty); IsInRange(expectedMinimum, expectedMaximum, actual, string.Empty);
} }
public static void IsContains(string expectedContained, string actualValue, string message = "")
{
if (!actualValue.Contains(expectedContained))
throw new AssertFailedException(string.Format("MoreAssert.IsContains failed. Expected contained: <{0}> Actual: <{1}>. {2}",
expectedContained, actualValue, message));
}
public static void IsMatch(string expectedPattern, string actualValue) public static void IsMatch(string expectedPattern, string actualValue)
{ {
Assert.IsTrue(Regex.IsMatch(actualValue, expectedPattern), "Expected pattern: <" + expectedPattern + ">. Actual value: <" + actualValue + ">."); Assert.IsTrue(Regex.IsMatch(actualValue, expectedPattern), "Expected pattern: <" + expectedPattern + ">. Actual value: <" + actualValue + ">.");
......
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