Commit ac8243a6 authored by Brickner_cp's avatar Brickner_cp

TCP

parent 1830bbda
using System;
using System.Collections.Generic;
using System.Text;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport;
namespace PcapDotNet.Core.Test
{
internal static class MoreTcpOption
{
public static string GetWiresharkString(this TcpOption option)
{
switch (option.OptionType)
{
case TcpOptionType.EndOfOptionList:
return "EOL";
case TcpOptionType.NoOperation:
return "NOP";
case TcpOptionType.MaximumSegmentSize:
return "Security";
default:
throw new InvalidOperationException("Illegal option type " + option.OptionType);
}
}
public static IEnumerable<string> GetWiresharkSubfieldStrings(this TcpOption option)
{
switch (option.OptionType)
{
case TcpOptionType.EndOfOptionList:
case TcpOptionType.NoOperation:
case TcpOptionType.MaximumSegmentSize:
break;
case TcpOptionType.WindowScale:
yield return "";
break;
default:
throw new InvalidOperationException("Illegal option type " + option.OptionType);
}
}
}
}
\ No newline at end of file
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
<Compile Include="MoreAssert.cs" /> <Compile Include="MoreAssert.cs" />
<Compile Include="LivePacketDeviceTests.cs" /> <Compile Include="LivePacketDeviceTests.cs" />
<Compile Include="MoreIpV4Option.cs" /> <Compile Include="MoreIpV4Option.cs" />
<Compile Include="MoreTcpOption.cs" />
<Compile Include="MoreXElement.cs" /> <Compile Include="MoreXElement.cs" />
<Compile Include="PacketDumpFileTests.cs" /> <Compile Include="PacketDumpFileTests.cs" />
<Compile Include="PacketHandler.cs" /> <Compile Include="PacketHandler.cs" />
......
...@@ -153,7 +153,8 @@ namespace PcapDotNet.Core.Test ...@@ -153,7 +153,8 @@ namespace PcapDotNet.Core.Test
random.NextIpV4Address(), random.NextIpV4Address(), random.NextIpV4Options(), random.NextIpV4Address(), random.NextIpV4Address(), random.NextIpV4Options(),
random.NextUShort(), random.NextUShort(), random.NextUInt(), random.NextUInt(), random.NextUShort(), random.NextUShort(), random.NextUInt(), random.NextUInt(),
random.NextFlags<TcpFlags>(), random.NextFlags<TcpFlags>(),
random.NextUShort(), random.NextUShort(), new TcpOptions(), random.NextUShort(), random.NextUShort(),
random.NextTcpOptions(),
random.NextDatagram(random.Next(100))); random.NextDatagram(random.Next(100)));
break; break;
} }
...@@ -579,7 +580,49 @@ namespace PcapDotNet.Core.Test ...@@ -579,7 +580,49 @@ namespace PcapDotNet.Core.Test
case "tcp.urgent_pointer": case "tcp.urgent_pointer":
field.AssertShowDecimal(tcpDatagram.UrgentPointer); field.AssertShowDecimal(tcpDatagram.UrgentPointer);
break; break;
case "tcp.options":
CompareTcpOptions(field, tcpDatagram.Options);
break;
}
}
}
private static void CompareTcpOptions(XElement element, TcpOptions options)
{
int currentOptionIndex = 0;
foreach (var field in element.Fields())
{
if (currentOptionIndex >= options.Count)
{
Assert.IsFalse(options.IsValid);
Assert.Fail();
} }
TcpOption option = options[currentOptionIndex];
switch (field.Name())
{
case "":
field.AssertShow(option.GetWiresharkString());
++currentOptionIndex;
break;
case "tcp.options.mss":
field.AssertShowDecimal(option is TcpOptionMaximumSegmentSize);
break;
case "tcp.options.mss_val":
field.AssertShowDecimal(((TcpOptionMaximumSegmentSize)option).MaximumSegmentSize);
++currentOptionIndex;
break;
default:
throw new InvalidOperationException(field.Name());
}
// var optionShows = from f in field.Fields() select f.Show();
//
// Assert.IsTrue(optionShows.SequenceEqual(option.GetWiresharkSubfieldStrings()));
} }
} }
} }
......
...@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test ...@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test
{ {
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");
const EthernetType ethernetType = EthernetType.IpV4;
Random random = new Random(); Random random = new Random();
...@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test ...@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test
IpV4FragmentationOptions ipV4FragmentationOptions = random.NextEnum<IpV4FragmentationOptions>(); IpV4FragmentationOptions ipV4FragmentationOptions = random.NextEnum<IpV4FragmentationOptions>();
ushort ipV4FragmentationOffset = (ushort)(random.NextUShort(ushort.MaxValue / 8) * 8); ushort ipV4FragmentationOffset = (ushort)(random.NextUShort(ushort.MaxValue / 8) * 8);
IpV4Fragmentation ipV4Fragmentation = new IpV4Fragmentation(ipV4FragmentationOptions, ipV4FragmentationOffset); IpV4Fragmentation ipV4Fragmentation = new IpV4Fragmentation(ipV4FragmentationOptions, ipV4FragmentationOffset);
IpV4Protocol ipV4Protocol = random.NextEnum<IpV4Protocol>();
IpV4Address ipV4Source = new IpV4Address(random.NextUInt()); IpV4Address ipV4Source = new IpV4Address(random.NextUInt());
IpV4Address ipV4Destination = new IpV4Address(random.NextUInt()); IpV4Address ipV4Destination = new IpV4Address(random.NextUInt());
IpV4Options ipV4Options = random.NextIpV4Options(); IpV4Options ipV4Options = random.NextIpV4Options();
...@@ -90,7 +88,7 @@ namespace PcapDotNet.Packets.Test ...@@ -90,7 +88,7 @@ namespace PcapDotNet.Packets.Test
TcpFlags tcpFlags = random.NextFlags<TcpFlags>(); TcpFlags tcpFlags = random.NextFlags<TcpFlags>();
ushort tcpWindow = random.NextUShort(); ushort tcpWindow = random.NextUShort();
ushort tcpUrgentPointer = random.NextUShort(); ushort tcpUrgentPointer = random.NextUShort();
TcpOptions tcpOptions = new TcpOptions(); TcpOptions tcpOptions = random.NextTcpOptions();
Datagram tcpPayload = random.NextDatagram(random.Next(60000)); Datagram tcpPayload = random.NextDatagram(random.Next(60000));
Packet packet = PacketBuilder.EthernetIpV4Tcp(DateTime.Now, Packet packet = PacketBuilder.EthernetIpV4Tcp(DateTime.Now,
...@@ -103,7 +101,7 @@ namespace PcapDotNet.Packets.Test ...@@ -103,7 +101,7 @@ namespace PcapDotNet.Packets.Test
Assert.IsTrue(packet.IsValid); Assert.IsTrue(packet.IsValid);
// UDP // TCP
Assert.AreEqual(tcpSourcePort, packet.Ethernet.IpV4.Tcp.SourcePort, "Source Port"); Assert.AreEqual(tcpSourcePort, packet.Ethernet.IpV4.Tcp.SourcePort, "Source Port");
Assert.AreEqual(tcpDestinationPort, packet.Ethernet.IpV4.Tcp.DestinationPort, "Destination Port"); Assert.AreEqual(tcpDestinationPort, packet.Ethernet.IpV4.Tcp.DestinationPort, "Destination Port");
Assert.AreEqual(tcpSequenceNumber, packet.Ethernet.IpV4.Tcp.SequenceNumber, "Sequence Number"); Assert.AreEqual(tcpSequenceNumber, packet.Ethernet.IpV4.Tcp.SequenceNumber, "Sequence Number");
...@@ -111,20 +109,20 @@ namespace PcapDotNet.Packets.Test ...@@ -111,20 +109,20 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(tcpFlags, packet.Ethernet.IpV4.Tcp.Flags, "Flags"); Assert.AreEqual(tcpFlags, packet.Ethernet.IpV4.Tcp.Flags, "Flags");
Assert.AreEqual(tcpWindow, packet.Ethernet.IpV4.Tcp.Window, "Window"); Assert.AreEqual(tcpWindow, packet.Ethernet.IpV4.Tcp.Window, "Window");
Assert.AreEqual(tcpUrgentPointer, packet.Ethernet.IpV4.Tcp.UrgentPointer, "Urgent Pointer"); Assert.AreEqual(tcpUrgentPointer, packet.Ethernet.IpV4.Tcp.UrgentPointer, "Urgent Pointer");
Assert.AreEqual(tcpOptions, packet.Ethernet.IpV4.Tcp.Options, "Options");
Assert.AreEqual((tcpFlags & TcpFlags.Ack) == TcpFlags.Ack, packet.Ethernet.IpV4.Tcp.IsAck, "IsAck");
Assert.AreEqual((tcpFlags & TcpFlags.Cwr) == TcpFlags.Cwr, packet.Ethernet.IpV4.Tcp.IsCwr, "IsCwr");
Assert.AreEqual((tcpFlags & TcpFlags.Ece) == TcpFlags.Ece, packet.Ethernet.IpV4.Tcp.IsEce, "IsEce");
Assert.AreEqual((tcpFlags & TcpFlags.Fin) == TcpFlags.Fin, packet.Ethernet.IpV4.Tcp.IsFin, "IsFin");
Assert.AreEqual((tcpFlags & TcpFlags.Psh) == TcpFlags.Psh, packet.Ethernet.IpV4.Tcp.IsPush, "IsPush");
Assert.AreEqual((tcpFlags & TcpFlags.Rst) == TcpFlags.Rst, packet.Ethernet.IpV4.Tcp.IsReset, "IsReset");
Assert.AreEqual((tcpFlags & TcpFlags.Syn) == TcpFlags.Syn, packet.Ethernet.IpV4.Tcp.IsSyn, "IsSyn");
Assert.AreEqual((tcpFlags & TcpFlags.Urg) == TcpFlags.Urg, packet.Ethernet.IpV4.Tcp.IsUrg, "IsUrg");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(TcpDatagram.HeaderMinimumLength + tcpOptions.BytesLength + tcpPayload.Length, packet.Ethernet.IpV4.Tcp.Length, "Total Length"); Assert.AreEqual(TcpDatagram.HeaderMinimumLength + tcpOptions.BytesLength + tcpPayload.Length, packet.Ethernet.IpV4.Tcp.Length, "Total Length");
Assert.IsTrue(packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect"); Assert.IsTrue(packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.AreEqual(tcpPayload, packet.Ethernet.IpV4.Tcp.Payload, "Payload"); Assert.AreEqual(tcpPayload, packet.Ethernet.IpV4.Tcp.Payload, "Payload");
} }
} }
[TestMethod]
public void UdpChecksumTest()
{
Packet packet = Packet.FromHexadecimalString(
"3352c58e71ffc4f39ec3bae508004cfe0043361200008611eec22ea2c8d11e9eb7b9520c2a33f2bbbed998980bba4404f941019404eb51880496ce00000005a87a270013a683f572c10e1504a0df15448a",
DateTime.Now, DataLinkKind.Ethernet);
Assert.IsTrue(packet.Ethernet.IpV4.IsTransportChecksumCorrect);
}
} }
} }
\ No newline at end of file
...@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test ...@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test
{ {
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");
const EthernetType ethernetType = EthernetType.IpV4;
Random random = new Random(); Random random = new Random();
...@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test ...@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test
IpV4FragmentationOptions ipV4FragmentationOptions = random.NextEnum<IpV4FragmentationOptions>(); IpV4FragmentationOptions ipV4FragmentationOptions = random.NextEnum<IpV4FragmentationOptions>();
ushort ipV4FragmentationOffset = (ushort)(random.NextUShort(ushort.MaxValue / 8) * 8); ushort ipV4FragmentationOffset = (ushort)(random.NextUShort(ushort.MaxValue / 8) * 8);
IpV4Fragmentation ipV4Fragmentation = new IpV4Fragmentation(ipV4FragmentationOptions, ipV4FragmentationOffset); IpV4Fragmentation ipV4Fragmentation = new IpV4Fragmentation(ipV4FragmentationOptions, ipV4FragmentationOffset);
IpV4Protocol ipV4Protocol = random.NextEnum<IpV4Protocol>();
IpV4Address ipV4Source = new IpV4Address(random.NextUInt()); IpV4Address ipV4Source = new IpV4Address(random.NextUInt());
IpV4Address ipV4Destination = new IpV4Address(random.NextUInt()); IpV4Address ipV4Destination = new IpV4Address(random.NextUInt());
IpV4Options ipV4Options = random.NextIpV4Options(); IpV4Options ipV4Options = random.NextIpV4Options();
...@@ -103,6 +101,7 @@ namespace PcapDotNet.Packets.Test ...@@ -103,6 +101,7 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(UdpDatagram.HeaderLength + udpPayload.Length, packet.Ethernet.IpV4.Udp.TotalLength, "Total Length"); Assert.AreEqual(UdpDatagram.HeaderLength + udpPayload.Length, packet.Ethernet.IpV4.Udp.TotalLength, "Total Length");
Assert.IsTrue(!udpCalculateChecksum && packet.Ethernet.IpV4.Udp.Checksum == 0 || Assert.IsTrue(!udpCalculateChecksum && packet.Ethernet.IpV4.Udp.Checksum == 0 ||
packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect"); packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.IsTrue(packet.Ethernet.IpV4.Udp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(udpPayload, packet.Ethernet.IpV4.Udp.Payload, "Payload"); Assert.AreEqual(udpPayload, packet.Ethernet.IpV4.Udp.Payload, "Payload");
} }
} }
......
...@@ -5,6 +5,7 @@ using System.Text; ...@@ -5,6 +5,7 @@ using System.Text;
using PcapDotNet.Packets; using PcapDotNet.Packets;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.IpV4; using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport;
using PcapDotNet.TestUtils; using PcapDotNet.TestUtils;
namespace PcapDotNet.Packets.TestUtils namespace PcapDotNet.Packets.TestUtils
...@@ -229,5 +230,71 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -229,5 +230,71 @@ namespace PcapDotNet.Packets.TestUtils
} }
return new IpV4Options(options); return new IpV4Options(options);
} }
public static TcpOption NextTcpOption(this Random random, int maximumOptionLength)
{
if (maximumOptionLength == 0)
throw new ArgumentOutOfRangeException("maximumOptionLength", maximumOptionLength, "option length must be positive");
List<TcpOptionType> impossibleOptionTypes = new List<TcpOptionType>();
if (maximumOptionLength < TcpOptionMaximumSegmentSize.OptionLength)
impossibleOptionTypes.Add(TcpOptionType.MaximumSegmentSize);
impossibleOptionTypes.Add(TcpOptionType.AlternateChecksumData);
impossibleOptionTypes.Add(TcpOptionType.AlternateChecksumRequest);
impossibleOptionTypes.Add(TcpOptionType.Cc);
impossibleOptionTypes.Add(TcpOptionType.CcEcho);
impossibleOptionTypes.Add(TcpOptionType.CcNew);
impossibleOptionTypes.Add(TcpOptionType.Echo);
impossibleOptionTypes.Add(TcpOptionType.EchoReply);
impossibleOptionTypes.Add(TcpOptionType.Md5Signature);
impossibleOptionTypes.Add(TcpOptionType.PartialOrderConnectionPermitted);
impossibleOptionTypes.Add(TcpOptionType.PartialOrderServiceProfile);
impossibleOptionTypes.Add(TcpOptionType.QuickStartResponse);
impossibleOptionTypes.Add(TcpOptionType.Sack);
impossibleOptionTypes.Add(TcpOptionType.SackPermitted);
impossibleOptionTypes.Add(TcpOptionType.TimeStamp);
impossibleOptionTypes.Add(TcpOptionType.UserTimeout);
impossibleOptionTypes.Add(TcpOptionType.WindowScale);
TcpOptionType optionType = random.NextEnum<TcpOptionType>(impossibleOptionTypes);
switch (optionType)
{
case TcpOptionType.EndOfOptionList:
return TcpOption.End;
case TcpOptionType.NoOperation:
return TcpOption.Nop;
case TcpOptionType.MaximumSegmentSize:
return new TcpOptionMaximumSegmentSize(random.NextUShort());
default:
throw new InvalidOperationException("optionType = " + optionType);
}
}
public static TcpOptions NextTcpOptions(this Random random)
{
int optionsLength = random.Next(TcpOptions.MaximumBytesLength) / 4 * 4;
List<TcpOption> options = new List<TcpOption>();
while (optionsLength > 0)
{
TcpOption option = random.NextTcpOption(optionsLength);
if (option.IsAppearsAtMostOnce &&
options.FindIndex(option.Equivalent) != -1)
{
continue;
}
options.Add(option);
optionsLength -= option.Length;
if (option.OptionType == TcpOptionType.EndOfOptionList)
break;
}
return new TcpOptions(options);
}
} }
} }
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