Commit 02e50af6 authored by Brickner_cp's avatar Brickner_cp

UInt128. Uses BigInteger to support formatting. Casting to and from...

UInt128. Uses BigInteger to support formatting. Casting to and from BigInteger. Cast to ulong can throw OverflowException. Improved GetHashCode().
Improved GRE tests.
4 warnings left.
parent 18182881
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Numerics" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="FuncExtensionsTest.cs" /> <Compile Include="FuncExtensionsTest.cs" />
......
using System; using System;
using System.Globalization; using System.Globalization;
using System.Numerics;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
using PcapDotNet.TestUtils; using PcapDotNet.TestUtils;
...@@ -47,6 +48,7 @@ namespace PcapDotNet.Base.Test ...@@ -47,6 +48,7 @@ namespace PcapDotNet.Base.Test
{ {
UInt128 value = random.NextUInt128(); UInt128 value = random.NextUInt128();
// Test equality
Assert.AreEqual(value, value); Assert.AreEqual(value, value);
Assert.AreNotEqual(value, string.Empty); Assert.AreNotEqual(value, string.Empty);
Assert.AreNotEqual(value, UInt128.MaxValue); Assert.AreNotEqual(value, UInt128.MaxValue);
...@@ -55,10 +57,63 @@ namespace PcapDotNet.Base.Test ...@@ -55,10 +57,63 @@ namespace PcapDotNet.Base.Test
Assert.IsTrue(value == value); Assert.IsTrue(value == value);
Assert.IsFalse(value != value); Assert.IsFalse(value != value);
// ReSharper restore EqualExpressionComparison // ReSharper restore EqualExpressionComparison
// Test GetHashCode
Assert.IsNotNull(value.GetHashCode()); Assert.IsNotNull(value.GetHashCode());
Assert.AreEqual(value, UInt128.Parse(value.ToString("X32"), NumberStyles.HexNumber, CultureInfo.InvariantCulture));
Assert.AreEqual(value >> 64, UInt128.Parse(((ulong)(value >> 64)).ToString("X16"), NumberStyles.HexNumber, CultureInfo.InvariantCulture)); // Test Parse()
Assert.AreEqual(value, UInt128.Parse(value.ToString()));
Assert.AreEqual(value, UInt128.Parse(value.ToString(), CultureInfo.InvariantCulture));
Assert.AreEqual(value, UInt128.Parse(value.ToString(), NumberStyles.Integer));
// Test TryParse()
UInt128 actualValue;
Assert.IsTrue(UInt128.TryParse(value.ToString(), out actualValue));
Assert.AreEqual(value, actualValue);
Assert.IsTrue(UInt128.TryParse(value.ToString(CultureInfo.InvariantCulture), out actualValue));
Assert.AreEqual(value, actualValue);
// Cast to UInt64
ulong smallValue = random.NextULong();
Assert.AreEqual(smallValue, (ulong)((UInt128)smallValue));
}
}
[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void CastToULongOverflow()
{
Random random = new Random();
UInt128 value;
try
{
value = (UInt128)(((BigInteger)ulong.MaxValue) + random.NextULong(ulong.MaxValue) + 1);
} }
catch (Exception)
{
Assert.Fail();
return;
}
Assert.AreEqual(value, (ulong)value);
Assert.Fail();
}
[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void ParseOverflow()
{
Assert.AreEqual(0, UInt128.Parse("-1"));
Assert.Fail();
}
[TestMethod]
public void TryParseOverflow()
{
UInt128 actual;
Assert.IsFalse(UInt128.TryParse("-1", out actual));
Assert.AreEqual(UInt128.Zero, actual);
Assert.IsFalse(UInt128.TryParse((UInt128.MaxValue + BigInteger.One).ToString(), out actual));
Assert.AreEqual(UInt128.Zero, actual);
} }
[TestMethod] [TestMethod]
...@@ -88,7 +143,7 @@ namespace PcapDotNet.Base.Test ...@@ -88,7 +143,7 @@ namespace PcapDotNet.Base.Test
for (int i = 0; i <= 32; ++i) for (int i = 0; i <= 32; ++i)
{ {
string andValueString = new string('0', i) + new string('F', ValueString.Length - i); string andValueString = new string('0', i) + new string('F', ValueString.Length - i);
UInt128 andValue = UInt128.Parse(andValueString, NumberStyles.HexNumber, CultureInfo.InvariantCulture); UInt128 andValue = UInt128.Parse("0" + andValueString, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
string expectedValueString = new string('0', i) + ValueString.Substring(i, ValueString.Length - i); string expectedValueString = new string('0', i) + ValueString.Substring(i, ValueString.Length - i);
UInt128 expectedValue = UInt128.Parse(expectedValueString, NumberStyles.HexNumber, CultureInfo.InvariantCulture); UInt128 expectedValue = UInt128.Parse(expectedValueString, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
UInt128 actualValue = value & andValue; UInt128 actualValue = value & andValue;
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq"> <Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
......
This diff is collapsed.
...@@ -869,6 +869,7 @@ namespace PcapDotNet.Core.Test ...@@ -869,6 +869,7 @@ namespace PcapDotNet.Core.Test
address.ToString()); address.ToString());
} }
} }
PacketCommunicator communicator = device.Open(); PacketCommunicator communicator = device.Open();
try try
{ {
......
...@@ -62,7 +62,7 @@ namespace PcapDotNet.Core.Test ...@@ -62,7 +62,7 @@ namespace PcapDotNet.Core.Test
[TestMethod] [TestMethod]
public void ComparePacketsToWiresharkTest() public void ComparePacketsToWiresharkTest()
{ {
for (int i = 0; i != 50; ++i) for (int i = 0; i != 10; ++i)
{ {
// Create packets // Create packets
List<Packet> packets = new List<Packet>(CreateRandomPackets(200)); List<Packet> packets = new List<Packet>(CreateRandomPackets(200));
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
<CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies> <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
<ReferenceOutputAssembly>true</ReferenceOutputAssembly> <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
</Reference> </Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml"> <Reference Include="System.Xml">
<CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies> <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
<ReferenceOutputAssembly>true</ReferenceOutputAssembly> <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
......
...@@ -205,62 +205,67 @@ namespace PcapDotNet.Packets.Test ...@@ -205,62 +205,67 @@ namespace PcapDotNet.Packets.Test
Random random = new Random(); Random random = new Random();
IpV4Layer ipV4Layer = random.NextIpV4Layer(IpV4Protocol.Gre); for (int i = 0; i != 100; ++i)
ipV4Layer.HeaderChecksum = null; {
IpV4Layer ipV4Layer = random.NextIpV4Layer(IpV4Protocol.Gre);
ipV4Layer.HeaderChecksum = null;
GreLayer greLayer = random.NextGreLayer(); GreLayer greLayer = random.NextGreLayer();
greLayer.Checksum = null; greLayer.Checksum = null;
greLayer.Routing = new List<GreSourceRouteEntry> greLayer.Routing = new List<GreSourceRouteEntry>
{ {
new GreSourceRouteEntryAs(new List<ushort> {123}.AsReadOnly(), 0), new GreSourceRouteEntryAs(new List<ushort> {123}.AsReadOnly(), 0),
new GreSourceRouteEntryIp(new List<IpV4Address> {random.NextIpV4Address()}.AsReadOnly(), new GreSourceRouteEntryIp(new List<IpV4Address> {random.NextIpV4Address()}.AsReadOnly(),
0) 0)
}.AsReadOnly(); }.AsReadOnly();
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer); PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer);
Packet packet = packetBuilder.Build(DateTime.Now); Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid, "IsValid"); Assert.IsTrue(packet.IsValid ||
new[]{EthernetType.IpV4, EthernetType.Arp}.Contains(greLayer.ProtocolType),
"IsValid. ProtoclType=" + greLayer.ProtocolType);
GreDatagram gre = packet.Ethernet.IpV4.Gre; GreDatagram gre = packet.Ethernet.IpV4.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, ipV4Layer, 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.IpV4.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, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
// PayloadOffset is too big // PayloadOffset is too big
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, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
// PayloadOffset isn't aligned to ip // PayloadOffset isn't aligned to ip
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, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
// PayloadOffset isn't aligned to as // PayloadOffset isn't aligned to as
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, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now); packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid); Assert.IsFalse(packet.IsValid);
}
} }
} }
} }
\ No newline at end of file
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Numerics" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="ArpTests.cs" /> <Compile Include="ArpTests.cs" />
......
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq"> <Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
......
...@@ -135,18 +135,13 @@ namespace PcapDotNet.Packets.IpV6 ...@@ -135,18 +135,13 @@ namespace PcapDotNet.Packets.IpV6
/// </summary> /// </summary>
public override string ToString() public override string ToString()
{ {
string valueString = _value.ToString("X33", CultureInfo.InvariantCulture).Substring(1);
StringBuilder stringBuilder = new StringBuilder(39); StringBuilder stringBuilder = new StringBuilder(39);
for (int i = 0; i != 8; ++i) for (int i = 0; i != 8; ++i)
{ {
if (i != 0) if (i != 0)
stringBuilder.Append(':'); stringBuilder.Append(':');
string andZerosBefore = new string('0', i * 4); stringBuilder.Append(valueString.Substring(i * 4, 4));
string andZerosAfter = new string('0', 28 - i * 4);
string andString = andZerosBefore + "FFFF" + andZerosAfter;
UInt128 andValue = UInt128.Parse(andString, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
ushort value = (ushort)((_value & andValue) >> (112 - i * 16));
stringBuilder.Append(value.ToString("X4", CultureInfo.InvariantCulture));
} }
return stringBuilder.ToString(); return stringBuilder.ToString();
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq"> <Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
......
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