Commit cc7cd211 authored by Brickner_cp's avatar Brickner_cp

GRE

parent 919c9236
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Gre;
using PcapDotNet.Packets.Icmp;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.TestUtils;
using PcapDotNet.TestUtils;
namespace PcapDotNet.Packets.Test
{
/// <summary>
/// Summary description for GreTests
/// </summary>
[TestClass]
public class GreTests
{
public GreTests()
{
//
// TODO: Add constructor logic here
//
}
/// <summary>
/// Gets or sets the test context which provides
/// information about and functionality for the current test run.
/// </summary>
public TestContext TestContext { get; set; }
#region Additional test attributes
//
// You can use the following additional attributes as you write your tests:
//
// Use ClassInitialize to run code before running the first test in the class
// [ClassInitialize()]
// public static void MyClassInitialize(TestContext testContext) { }
//
// Use ClassCleanup to run code after all tests in a class have run
// [ClassCleanup()]
// public static void MyClassCleanup() { }
//
// Use TestInitialize to run code before running each test
// [TestInitialize()]
// public void MyTestInitialize() { }
//
// Use TestCleanup to run code after each test has run
// [TestCleanup()]
// public void MyTestCleanup() { }
//
#endregion
[TestMethod]
public void RandomGreTest()
{
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();
IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
for (int i = 0; i != 100; ++i)
{
GreLayer greLayer = random.NextGreLayer();
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer);
Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid, "IsValid");
// Ethernet
ethernetLayer.EtherType = EthernetType.IpV4;
Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
// IPv4
ipV4Layer.Protocol = IpV4Protocol.InternetControlMessageProtocol;
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,
packet.Ethernet.IpV4.TotalLength);
Assert.AreEqual(IpV4Datagram.DefaultVersion, packet.Ethernet.IpV4.Version);
// GRE
GreDatagram actualGre = packet.Ethernet.IpV4.Gre;
GreLayer actualGreLayer = (GreLayer)actualGre.ExtractLayer();
Assert.AreEqual(greLayer, actualGreLayer, "Layer");
}
}
}
}
\ No newline at end of file
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
<Compile Include="DataLinkTests.cs" /> <Compile Include="DataLinkTests.cs" />
<Compile Include="EndianitiyTests.cs" /> <Compile Include="EndianitiyTests.cs" />
<Compile Include="EthernetTests.cs" /> <Compile Include="EthernetTests.cs" />
<Compile Include="GreTests.cs" />
<Compile Include="IcmpTests.cs" /> <Compile Include="IcmpTests.cs" />
<Compile Include="IgmpTests.cs" /> <Compile Include="IgmpTests.cs" />
<Compile Include="IpV4Tests.cs" /> <Compile Include="IpV4Tests.cs" />
......
...@@ -6,6 +6,7 @@ using PcapDotNet.Base; ...@@ -6,6 +6,7 @@ using PcapDotNet.Base;
using PcapDotNet.Packets; using PcapDotNet.Packets;
using PcapDotNet.Packets.Arp; using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Gre;
using PcapDotNet.Packets.Icmp; using PcapDotNet.Packets.Icmp;
using PcapDotNet.Packets.Igmp; using PcapDotNet.Packets.Igmp;
using PcapDotNet.Packets.IpV4; using PcapDotNet.Packets.IpV4;
...@@ -578,6 +579,12 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -578,6 +579,12 @@ namespace PcapDotNet.Packets.TestUtils
} }
} }
// GRE
public static GreLayer NextGreLayer(this Random random)
{
return new GreLayer();
}
// ICMP // ICMP
public static IcmpLayer NextIcmpLayer(this Random random) public static IcmpLayer NextIcmpLayer(this Random random)
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.IpV4; using PcapDotNet.Packets.IpV4;
...@@ -49,36 +50,33 @@ namespace PcapDotNet.Packets.Gre ...@@ -49,36 +50,33 @@ namespace PcapDotNet.Packets.Gre
public const byte StrictSourceRoute = 0x08; public const byte StrictSourceRoute = 0x08;
public const byte RecursionControl = 0x07; public const byte RecursionControl = 0x07;
public const byte Version = 0x07; public const byte Version = 0x07;
// private const ushort Reserved0 = 0x7FF8;
} }
public const int HeaderMinimumLength = 4; public const int HeaderMinimumLength = 4;
public const int HeaderMaximumLength = 8;
public int HeaderLength public int HeaderLength
{ {
get get
{ {
if (ChecksumPresent) return OffsetRouting + (RoutingPresent
return HeaderMaximumLength; ? Routing.Sum(entry => entry.Length) + GreSourceRouteEntry.HeaderLength // Routing and Routing termination
return HeaderMinimumLength; : 0);
} }
} }
private int OffsetKey private int OffsetKey
{ {
get{return HeaderMinimumLength + ((ChecksumPresent || RoutingPresent) ? 4 : 0);} get{return HeaderMinimumLength + ((ChecksumPresent || RoutingPresent) ? sizeof(ushort) + sizeof(ushort) : 0);}
} }
private int OffsetSequenceNumber private int OffsetSequenceNumber
{ {
get{return OffsetKey + (KeyPresent ? 4 : 0);} get { return OffsetKey + (KeyPresent ? sizeof(uint) : 0); }
} }
private int OffsetRouting private int OffsetRouting
{ {
get{return OffsetSequenceNumber + (SequenceNumberPresent ? 4 : 0);} get { return OffsetSequenceNumber + (SequenceNumberPresent ? sizeof(uint) : 0); }
} }
/// <summary> /// <summary>
...@@ -87,7 +85,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -87,7 +85,7 @@ namespace PcapDotNet.Packets.Gre
/// </summary> /// </summary>
public bool ChecksumPresent public bool ChecksumPresent
{ {
get { return (this[Offset.ChecksumPresent] & Mask.ChecksumPresent) != 0; } get { return (this[Offset.ChecksumPresent] & Mask.ChecksumPresent) == Mask.ChecksumPresent; }
} }
/// <summary> /// <summary>
...@@ -96,7 +94,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -96,7 +94,7 @@ namespace PcapDotNet.Packets.Gre
/// </summary> /// </summary>
public bool RoutingPresent public bool RoutingPresent
{ {
get { return (this[Offset.RoutingPresent] & Mask.RoutingPresent) != 0; } get { return (this[Offset.RoutingPresent] & Mask.RoutingPresent) == Mask.RoutingPresent; }
} }
/// <summary> /// <summary>
...@@ -105,7 +103,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -105,7 +103,7 @@ namespace PcapDotNet.Packets.Gre
/// </summary> /// </summary>
public bool KeyPresent public bool KeyPresent
{ {
get { return (this[Offset.KeyPresent] & Mask.KeyPresent) != 0; } get { return (this[Offset.KeyPresent] & Mask.KeyPresent) == Mask.KeyPresent; }
} }
/// <summary> /// <summary>
...@@ -114,7 +112,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -114,7 +112,7 @@ namespace PcapDotNet.Packets.Gre
/// </summary> /// </summary>
public bool SequenceNumberPresent public bool SequenceNumberPresent
{ {
get { return (this[Offset.SequenceNumberPresent] & Mask.SequenceNumberPresent) != 0; } get { return (this[Offset.SequenceNumberPresent] & Mask.SequenceNumberPresent) == Mask.SequenceNumberPresent; }
} }
/// <summary> /// <summary>
...@@ -123,7 +121,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -123,7 +121,7 @@ namespace PcapDotNet.Packets.Gre
/// </summary> /// </summary>
public bool StrictSourceRoute public bool StrictSourceRoute
{ {
get { return (this[Offset.StrictSourceRoute] & Mask.StrictSourceRoute) != 0; } get { return (this[Offset.StrictSourceRoute] & Mask.StrictSourceRoute) == Mask.StrictSourceRoute; }
} }
...@@ -257,8 +255,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -257,8 +255,7 @@ namespace PcapDotNet.Packets.Gre
protected override bool CalculateIsValid() protected override bool CalculateIsValid()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
// return (Length >= HeaderMinimumLength && HeaderLength >= HeaderLength && return (Length >= HeaderMinimumLength && Length >= HeaderLength);
// Reserved0 == 0 && Reserved1 == 0);
} }
internal GreDatagram(byte[] buffer, int offset, int length) internal GreDatagram(byte[] buffer, int offset, int length)
...@@ -266,6 +263,11 @@ namespace PcapDotNet.Packets.Gre ...@@ -266,6 +263,11 @@ namespace PcapDotNet.Packets.Gre
{ {
} }
internal static void WriteHeader(byte[] buffer, int offset)
{
throw new NotImplementedException();
}
private IpV4Datagram _ipV4; private IpV4Datagram _ipV4;
private ReadOnlyCollection<GreSourceRouteEntry> _routing; private ReadOnlyCollection<GreSourceRouteEntry> _routing;
private bool _isValidRouting = true; private bool _isValidRouting = true;
...@@ -281,6 +283,13 @@ namespace PcapDotNet.Packets.Gre ...@@ -281,6 +283,13 @@ namespace PcapDotNet.Packets.Gre
public const int SreLength = 3; public const int SreLength = 3;
} }
public int Length
{
get { return HeaderLength + PayloadLength; }
}
public abstract int PayloadLength { get; }
internal static bool TryReadEntry(byte[] buffer, ref int offset, int length, out GreSourceRouteEntry entry) internal static bool TryReadEntry(byte[] buffer, ref int offset, int length, out GreSourceRouteEntry entry)
{ {
entry = null; entry = null;
...@@ -351,6 +360,11 @@ namespace PcapDotNet.Packets.Gre ...@@ -351,6 +360,11 @@ namespace PcapDotNet.Packets.Gre
public class GreSourceRouteEntryIp : GreSourceRouteEntry public class GreSourceRouteEntryIp : GreSourceRouteEntry
{ {
public override int PayloadLength
{
get { return IpV4Address.SizeOf; }
}
public ReadOnlyCollection<IpV4Address> Addresses public ReadOnlyCollection<IpV4Address> Addresses
{ {
get { return _addresses; } get { return _addresses; }
...@@ -378,6 +392,11 @@ namespace PcapDotNet.Packets.Gre ...@@ -378,6 +392,11 @@ namespace PcapDotNet.Packets.Gre
public class GreSourceRouteEntryAs : GreSourceRouteEntry public class GreSourceRouteEntryAs : GreSourceRouteEntry
{ {
public override int PayloadLength
{
get { return sizeof(ushort); }
}
public ReadOnlyCollection<ushort> AsNumbers public ReadOnlyCollection<ushort> AsNumbers
{ {
get { return _asNumbers; } get { return _asNumbers; }
...@@ -405,6 +424,11 @@ namespace PcapDotNet.Packets.Gre ...@@ -405,6 +424,11 @@ namespace PcapDotNet.Packets.Gre
public class GreSourceRouteEntryUnknown : GreSourceRouteEntry public class GreSourceRouteEntryUnknown : GreSourceRouteEntry
{ {
public override int PayloadLength
{
get { return Data.Length; }
}
public Datagram Data public Datagram Data
{ {
get { return _data; } get { return _data; }
...@@ -424,6 +448,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -424,6 +448,7 @@ namespace PcapDotNet.Packets.Gre
private readonly Datagram _data; private readonly Datagram _data;
private readonly int _offset; private readonly int _offset;
} }
public enum GreSourceRouteEntryAddressFamily : ushort public enum GreSourceRouteEntryAddressFamily : ushort
{ {
None = 0x0000, None = 0x0000,
......
using System;
using System.Collections.ObjectModel;
using PcapDotNet.Packets.Ethernet;
namespace PcapDotNet.Packets.Gre
{
public class GreLayer : Layer
{
public byte RecursionControl { get; set; }
public GreVersion Version { get; set; }
public EthernetType ProtocolType { get; set; }
public ushort? Checksum { get; set; }
public ushort? RoutingOffset { get; set; }
public uint? Key { get; set; }
public uint? SequenceNumber { get; set; }
public ReadOnlyCollection<GreSourceRouteEntry> Routing { get; set; }
public override int Length
{
get { throw new NotImplementedException(); }
}
public override void Write(byte[] buffer, int offset, int payloadLength, ILayer previousLayer, ILayer nextLayer)
{
GreDatagram.WriteHeader(buffer, offset);
}
public override bool Equals(Layer other)
{
throw new NotImplementedException();
}
}
}
\ No newline at end of file
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
<Compile Include="Ethernet\MacAddress.cs" /> <Compile Include="Ethernet\MacAddress.cs" />
<Compile Include="Arp\IArpPreviousLayer.cs" /> <Compile Include="Arp\IArpPreviousLayer.cs" />
<Compile Include="Gre\GreDatagram.cs" /> <Compile Include="Gre\GreDatagram.cs" />
<Compile Include="Gre\GreLayer.cs" />
<Compile Include="Icmp\IcmpAddressMaskReplyDatagram.cs" /> <Compile Include="Icmp\IcmpAddressMaskReplyDatagram.cs" />
<Compile Include="Icmp\IcmpAddressMaskReplyLayer.cs" /> <Compile Include="Icmp\IcmpAddressMaskReplyLayer.cs" />
<Compile Include="Icmp\IcmpAddressMaskRequestLayer.cs" /> <Compile Include="Icmp\IcmpAddressMaskRequestLayer.cs" />
......
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