Commit 6cec2f16 authored by Brickner_cp's avatar Brickner_cp

VLanTaggedFrame

parent f2a2a4e6
...@@ -184,7 +184,7 @@ namespace PcapDotNet.Core.Test ...@@ -184,7 +184,7 @@ namespace PcapDotNet.Core.Test
TestReceivePacketsEnumerable(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, 2, PacketSize, NumPacketsToSend, 2, 2.13); TestReceivePacketsEnumerable(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, 2, PacketSize, NumPacketsToSend, 2, 2.13);
// Break loop // Break loop
TestReceivePacketsEnumerable(NumPacketsToSend, NumPacketsToSend, 0, 2, PacketSize, 0, 0, 0.032); TestReceivePacketsEnumerable(NumPacketsToSend, NumPacketsToSend, 0, 2, PacketSize, 0, 0, 0.051);
TestReceivePacketsEnumerable(NumPacketsToSend, NumPacketsToSend, NumPacketsToSend / 2, 2, PacketSize, NumPacketsToSend / 2, 0, 0.1); TestReceivePacketsEnumerable(NumPacketsToSend, NumPacketsToSend, NumPacketsToSend / 2, 2, PacketSize, NumPacketsToSend / 2, 0, 0.1);
} }
......
...@@ -15,6 +15,7 @@ using PcapDotNet.Packets.Icmp; ...@@ -15,6 +15,7 @@ using PcapDotNet.Packets.Icmp;
using PcapDotNet.Packets.IpV4; using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.TestUtils; using PcapDotNet.Packets.TestUtils;
using PcapDotNet.Packets.Transport; using PcapDotNet.Packets.Transport;
using PcapDotNet.Packets.VLanTaggedFrame;
using PcapDotNet.TestUtils; using PcapDotNet.TestUtils;
namespace PcapDotNet.Core.Test namespace PcapDotNet.Core.Test
...@@ -141,134 +142,157 @@ namespace PcapDotNet.Core.Test ...@@ -141,134 +142,157 @@ namespace PcapDotNet.Core.Test
ComparePacketsToWireshark(packet); ComparePacketsToWireshark(packet);
} }
private enum PacketType
{
Ethernet,
Arp,
IpV4,
IpV4OverIpV4,
Igmp,
Icmp,
Gre,
Udp,
Tcp,
Dns,
Http,
}
private static Packet CreateRandomPacket(Random random) private static Packet CreateRandomPacket(Random random)
{ {
PacketType packetType = random.NextEnum<PacketType>();
// BUG: Limited timestamp due to Windows bug: https://connect.microsoft.com/VisualStudio/feedback/details/559198/net-4-datetime-tolocaltime-is-sometimes-wrong
Packet packet; Packet packet;
do do
{ {
packet = CreateRandomPacket(random, packetType); // TODO. BUG: Limited timestamp due to Windows bug: https://connect.microsoft.com/VisualStudio/feedback/details/559198/net-4-datetime-tolocaltime-is-sometimes-wrong
DateTime packetTimestamp =
random.NextDateTime(new DateTime(2010, 1, 1), new DateTime(2010, 12, 31)).ToUniversalTime().ToLocalTime();
//random.NextDateTime(PacketTimestamp.MinimumPacketTimestamp, PacketTimestamp.MaximumPacketTimestamp).ToUniversalTime().ToLocalTime();
List<ILayer> layers = new List<ILayer>();
EthernetLayer ethernetLayer = random.NextEthernetLayer();
layers.Add(ethernetLayer);
CreateRandomEthernetPayload(random, ethernetLayer, layers);
packet = PacketBuilder.Build(packetTimestamp, layers);
} while (packet.Length > 65536); } while (packet.Length > 65536);
return packet; return packet;
} }
private static Packet CreateRandomPacket(Random random, PacketType packetType) private static void CreateRandomEthernetPayload(Random random, EthernetBaseLayer ethernetBaseLayer, List<ILayer> layers)
{ {
DateTime packetTimestamp = if (random.NextBool(20))
random.NextDateTime(new DateTime(2010,1,1), new DateTime(2010,12,31)).ToUniversalTime().ToLocalTime();
//random.NextDateTime(PacketTimestamp.MinimumPacketTimestamp, PacketTimestamp.MaximumPacketTimestamp).ToUniversalTime().ToLocalTime();
EthernetLayer ethernetLayer = random.NextEthernetLayer();
IpV4Layer ipV4Layer = random.NextIpV4Layer();
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(100));
switch (packetType)
// switch (PacketType.Icmp)
{ {
case PacketType.Ethernet: // Finish with payload.
return PacketBuilder.Build(DateTime.Now, ethernetLayer, payloadLayer); PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(100));
layers.Add(payloadLayer);
case PacketType.Arp: return;
ethernetLayer.EtherType = EthernetType.None; }
ethernetLayer.Destination = MacAddress.Zero;
return PacketBuilder.Build(packetTimestamp, ethernetLayer, random.NextArpLayer());
case PacketType.IpV4:
ethernetLayer.EtherType = EthernetType.None;
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, payloadLayer);
case PacketType.IpV4OverIpV4:
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, random.NextIpV4Layer(), payloadLayer);
case PacketType.Igmp:
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, random.NextIgmpLayer());
case PacketType.Icmp:
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
IcmpLayer icmpLayer = random.NextIcmpLayer();
IEnumerable<ILayer> icmpPayloadLayers = random.NextIcmpPayloadLayers(icmpLayer);
return PacketBuilder.Build(packetTimestamp, new ILayer[]{ethernetLayer, ipV4Layer, icmpLayer}.Concat(icmpPayloadLayers));
case PacketType.Gre:
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
GreLayer greLayer = random.NextGreLayer();
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, greLayer, payloadLayer);
case PacketType.Udp:
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
if (random.NextBool())
ipV4Layer.Fragmentation = IpV4Fragmentation.None;
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, random.NextUdpLayer(), payloadLayer);
case PacketType.Tcp:
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
if (random.NextBool())
ipV4Layer.Fragmentation = IpV4Fragmentation.None;
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, random.NextTcpLayer(), payloadLayer);
case PacketType.Dns:
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
if (random.NextBool())
ipV4Layer.Fragmentation = IpV4Fragmentation.None;
UdpLayer udpLayer = random.NextUdpLayer();
DnsLayer dnsLayer = random.NextDnsLayer(); ethernetBaseLayer.EtherType = EthernetType.None;
ushort specialPort = (ushort)(random.NextBool() ? 53 : 5355); switch (random.NextInt(0, 3))
if (dnsLayer.IsQuery) {
udpLayer.DestinationPort = specialPort; case 0: // VLanTaggedFrame.
else VLanTaggedFrameLayer vLanTaggedFrameLayer = random.NextVLanTaggedFrameLayer();
udpLayer.SourcePort = specialPort; layers.Add(vLanTaggedFrameLayer);
CreateRandomEthernetPayload(random, vLanTaggedFrameLayer, layers);
return;
case 1: // ARP.
EthernetLayer ethernetLayer = (ethernetBaseLayer as EthernetLayer);
if (ethernetLayer != null)
ethernetLayer.Destination = MacAddress.Zero;
layers.Add(random.NextArpLayer());
return;
case 2: // IPv4.
IpV4Layer ipV4Layer = random.NextIpV4Layer();
layers.Add(ipV4Layer);
CreateRandomIpV4Payload(random, ipV4Layer, layers);
return;
default:
throw new InvalidOperationException("Invalid value.");
}
}
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, udpLayer, dnsLayer); private static void CreateRandomIpV4Payload(Random random, IpV4Layer ipV4Layer, List<ILayer> layers)
{
if (random.NextBool(15))
{
// Finish with payload.
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(100));
layers.Add(payloadLayer);
return;
}
case PacketType.Http: ipV4Layer.Protocol = null;
ethernetLayer.EtherType = EthernetType.None; if (random.NextBool())
ipV4Layer.Protocol = null; ipV4Layer.Fragmentation = IpV4Fragmentation.None;
if (random.NextBool())
ipV4Layer.Fragmentation = IpV4Fragmentation.None;
TcpLayer tcpLayer = random.NextTcpLayer();
HttpLayer httpLayer = random.NextHttpLayer(); switch (random.Next(0, 6))
if (httpLayer.IsRequest) {
tcpLayer.DestinationPort = 80; case 0: // IpV4.
else IpV4Layer innerIpV4Layer = random.NextIpV4Layer();
tcpLayer.SourcePort = 80; layers.Add(innerIpV4Layer);
if (random.NextBool()) CreateRandomIpV4Payload(random, innerIpV4Layer, layers);
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, tcpLayer, httpLayer); return;
case 1: // Igmp.
layers.Add(random.NextIgmpLayer());
return;
case 2: // Icmp.
layers.Add(random.NextIcmpLayer());
return;
case 3: // Gre.
layers.Add(random.NextGreLayer());
return;
case 4: // Udp.
UdpLayer udpLayer = random.NextUdpLayer();
layers.Add(udpLayer);
CreateRandomUdpPayload(random, udpLayer, layers);
return;
HttpLayer httpLayer2 = httpLayer.IsRequest ? (HttpLayer)random.NextHttpRequestLayer() : random.NextHttpResponseLayer(); case 5: // Tcp.
return PacketBuilder.Build(packetTimestamp, ethernetLayer, ipV4Layer, tcpLayer, httpLayer, httpLayer2); TcpLayer tcpLayer = random.NextTcpLayer();
layers.Add(tcpLayer);
CreateRandomTcpPayload(random, tcpLayer, layers);
return;
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException("Invalid value.");
} }
} }
private static void CreateRandomUdpPayload(Random random, UdpLayer udpLayer, List<ILayer> layers)
{
if (random.NextBool(5))
{
// Finish with payload.
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(100));
layers.Add(payloadLayer);
return;
}
DnsLayer dnsLayer = random.NextDnsLayer();
layers.Add(dnsLayer);
ushort specialPort = (ushort)(random.NextBool() ? 53 : 5355);
if (dnsLayer.IsQuery)
udpLayer.DestinationPort = specialPort;
else
udpLayer.SourcePort = specialPort;
}
private static void CreateRandomTcpPayload(Random random, TcpLayer tcpLayer, List<ILayer> layers)
{
if (random.NextBool(20))
{
// Finish with payload.
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(100));
layers.Add(payloadLayer);
return;
}
HttpLayer httpLayer = random.NextHttpLayer();
layers.Add(httpLayer);
if (httpLayer.IsRequest)
tcpLayer.DestinationPort = 80;
else
tcpLayer.SourcePort = 80;
if (random.NextBool())
return;
HttpLayer httpLayer2 = httpLayer.IsRequest ? (HttpLayer)random.NextHttpRequestLayer() : random.NextHttpResponseLayer();
layers.Add(httpLayer2);
}
private static IEnumerable<Packet> CreateRandomPackets(Random random, int numPackets) private static IEnumerable<Packet> CreateRandomPackets(Random random, int numPackets)
{ {
for (int i = 0; i != numPackets; ++i) for (int i = 0; i != numPackets; ++i)
......
...@@ -84,6 +84,7 @@ namespace PcapDotNet.Packets.Test ...@@ -84,6 +84,7 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer()); Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer());
Assert.AreEqual(EthernetType.IpV4, packet.Ethernet.VLanTaggedFrame.EtherType); Assert.AreEqual(EthernetType.IpV4, packet.Ethernet.VLanTaggedFrame.EtherType);
Assert.AreEqual(vLanTaggedFrameLayer, packet.Ethernet.VLanTaggedFrame.ExtractLayer()); Assert.AreEqual(vLanTaggedFrameLayer, packet.Ethernet.VLanTaggedFrame.ExtractLayer());
ipV4Layer.HeaderChecksum = packet.Ethernet.VLanTaggedFrame.IpV4.HeaderChecksum;
Assert.AreEqual(ipV4Layer, packet.Ethernet.VLanTaggedFrame.IpV4.ExtractLayer()); Assert.AreEqual(ipV4Layer, packet.Ethernet.VLanTaggedFrame.IpV4.ExtractLayer());
} }
} }
......
...@@ -4,11 +4,46 @@ using PcapDotNet.Packets.Arp; ...@@ -4,11 +4,46 @@ using PcapDotNet.Packets.Arp;
namespace PcapDotNet.Packets.Ethernet namespace PcapDotNet.Packets.Ethernet
{ {
public abstract class EthernetBaseLayer : Layer, IArpPreviousLayer
{
public EthernetBaseLayer()
{
EtherType = EthernetType.None;
}
/// <summary>
/// Ethernet type (next protocol).
/// </summary>
public EthernetType EtherType { get; set; }
/// <summary>
/// The ARP Hardware Type of the layer before the ARP layer.
/// </summary>
public ArpHardwareType PreviousLayerHardwareType
{
get { return ArpHardwareType.Ethernet; }
}
internal static EthernetType GetEthernetType(EthernetType ethernetType, ILayer nextLayer)
{
if (ethernetType != EthernetType.None)
return ethernetType;
if (nextLayer == null)
throw new ArgumentException("Can't determine ether type automatically from next layer because there is not next layer");
IEthernetNextLayer ethernetNextLayer = nextLayer as IEthernetNextLayer;
if (ethernetNextLayer == null)
throw new ArgumentException("Can't determine ether type automatically from next layer (" + nextLayer.GetType() + ")");
return ethernetNextLayer.PreviousLayerEtherType;
}
}
/// <summary> /// <summary>
/// Represents an Ethernet layer. /// Represents an Ethernet layer.
/// <seealso cref="EthernetDatagram"/> /// <seealso cref="EthernetDatagram"/>
/// </summary> /// </summary>
public sealed class EthernetLayer : Layer, IArpPreviousLayer public sealed class EthernetLayer : EthernetBaseLayer
{ {
/// <summary> /// <summary>
/// Creates an instance with zero values. /// Creates an instance with zero values.
...@@ -17,7 +52,6 @@ namespace PcapDotNet.Packets.Ethernet ...@@ -17,7 +52,6 @@ namespace PcapDotNet.Packets.Ethernet
{ {
Source = MacAddress.Zero; Source = MacAddress.Zero;
Destination = MacAddress.Zero; Destination = MacAddress.Zero;
EtherType = EthernetType.None;
} }
/// <summary> /// <summary>
...@@ -30,11 +64,6 @@ namespace PcapDotNet.Packets.Ethernet ...@@ -30,11 +64,6 @@ namespace PcapDotNet.Packets.Ethernet
/// </summary> /// </summary>
public MacAddress Destination { get; set; } public MacAddress Destination { get; set; }
/// <summary>
/// Ethernet type (next protocol).
/// </summary>
public EthernetType EtherType { get; set; }
/// <summary> /// <summary>
/// The number of bytes this layer will take. /// The number of bytes this layer will take.
/// </summary> /// </summary>
...@@ -75,14 +104,6 @@ namespace PcapDotNet.Packets.Ethernet ...@@ -75,14 +104,6 @@ namespace PcapDotNet.Packets.Ethernet
get { return DataLinkKind.Ethernet; } get { return DataLinkKind.Ethernet; }
} }
/// <summary>
/// The ARP Hardware Type of the layer before the ARP layer.
/// </summary>
public ArpHardwareType PreviousLayerHardwareType
{
get { return ArpHardwareType.Ethernet; }
}
/// <summary> /// <summary>
/// Two Ethernet layers are equal if they have the same source, destination and ethernet type. /// Two Ethernet layers are equal if they have the same source, destination and ethernet type.
/// </summary> /// </summary>
......
...@@ -70,19 +70,5 @@ namespace PcapDotNet.Packets ...@@ -70,19 +70,5 @@ namespace PcapDotNet.Packets
{ {
return Length.GetHashCode() ^ DataLink.GetHashCode(); return Length.GetHashCode() ^ DataLink.GetHashCode();
} }
internal static EthernetType GetEthernetType(EthernetType ethernetType, ILayer nextLayer)
{
if (ethernetType != EthernetType.None)
return ethernetType;
if (nextLayer == null)
throw new ArgumentException("Can't determine ether type automatically from next layer because there is not next layer");
IEthernetNextLayer ethernetNextLayer = nextLayer as IEthernetNextLayer;
if (ethernetNextLayer == null)
throw new ArgumentException("Can't determine ether type automatically from next layer (" + nextLayer.GetType() + ")");
return ethernetNextLayer.PreviousLayerEtherType;
}
} }
} }
\ No newline at end of file
...@@ -4,7 +4,7 @@ using PcapDotNet.Packets.Ethernet; ...@@ -4,7 +4,7 @@ using PcapDotNet.Packets.Ethernet;
namespace PcapDotNet.Packets.VLanTaggedFrame namespace PcapDotNet.Packets.VLanTaggedFrame
{ {
public sealed class VLanTaggedFrameLayer : Layer, IEquatable<VLanTaggedFrameLayer>, IEthernetNextLayer public sealed class VLanTaggedFrameLayer : EthernetBaseLayer, IEquatable<VLanTaggedFrameLayer>, IEthernetNextLayer
{ {
public VLanTaggedFrameLayer() public VLanTaggedFrameLayer()
{ {
...@@ -21,8 +21,6 @@ namespace PcapDotNet.Packets.VLanTaggedFrame ...@@ -21,8 +21,6 @@ namespace PcapDotNet.Packets.VLanTaggedFrame
get { return VLanTaggedFrameDatagram.CalculateTagControlInformation(PriorityCodePoint, CanonicalFormatIndicator, VLanIdentifier); } get { return VLanTaggedFrameDatagram.CalculateTagControlInformation(PriorityCodePoint, CanonicalFormatIndicator, VLanIdentifier); }
} }
public EthernetType EtherType { get; set; }
/// <summary> /// <summary>
/// The number of bytes this layer will take. /// The number of bytes this layer will take.
/// </summary> /// </summary>
......
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