Commit cdb913a5 authored by Brickner_cp's avatar Brickner_cp

GRE

parent b9e2fbb1
......@@ -142,6 +142,14 @@ namespace PcapDotNet.Core.Test
ethernetLayer.EtherType = EthernetType.None;
ipV4Layer.Protocol = null;
GreLayer greLayer = random.NextGreLayer();
// GreLayer greLayer = new GreLayer
// {
// AcknowledgmentSequenceNumber = 10,
// ProtocolType = EthernetType.AppleTalk,
// //EthernetType.PointToPointProtocol,
// Key = 0,
// Version = GreVersion.EnhancedGre,
// };
// IEnumerable<ILayer> grePayloadLayers = random.NextIcmpPayloadLayers(icmpLayer);
return PacketBuilder.Build(packetTimestamp, new ILayer[] {ethernetLayer, ipV4Layer, greLayer});
......@@ -173,7 +181,7 @@ namespace PcapDotNet.Core.Test
private static void ComparePacketsToWireshark(IEnumerable<Packet> packets)
{
string pcapFilename = Path.GetTempPath() + "temp.pcap";
string pcapFilename = Path.GetTempPath() + "temp." + new Random().NextUShort() + ".pcap";
PacketDumpFile.Dump(pcapFilename, new PcapDataLink(DataLinkKind.Ethernet), PacketDevice.DefaultSnapshotLength, packets);
// List<Packet> packetsList = new List<Packet>();
// new OfflinePacketDevice(pcapFilename).Open().ReceivePackets(1000, packetsList.Add);
......@@ -851,31 +859,52 @@ namespace PcapDotNet.Core.Test
if (field.Show().StartsWith("Flags and version: "))
{
XElement[] innerFields = field.Fields().ToArray();
Assert.AreEqual(8, innerFields.Length);
bool isEnhanced = greDatagram.ProtocolType == EthernetType.PointToPointProtocol;
Assert.AreEqual(isEnhanced ? 9 : 8, innerFields.Length, "innerFields.Length");
foreach (var innerField in innerFields)
{
innerField.AssertName("");
}
innerFields[0].AssertShow(string.Format("{0}... .... .... .... = {1}", greDatagram.ChecksumPresent.ToInt(),
int currentInnerFieldIndex = 0;
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("{0}... .... .... .... = {1}", greDatagram.ChecksumPresent.ToInt(),
(greDatagram.ChecksumPresent ? "Checksum" : "No checksum")));
innerFields[1].AssertShow(string.Format(".{0}.. .... .... .... = {1}", greDatagram.RoutingPresent.ToInt(),
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".{0}.. .... .... .... = {1}", greDatagram.RoutingPresent.ToInt(),
(greDatagram.RoutingPresent ? "Routing" : "No routing")));
innerFields[2].AssertShow(string.Format("..{0}. .... .... .... = {1}", greDatagram.KeyPresent.ToInt(),
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("..{0}. .... .... .... = {1}", greDatagram.KeyPresent.ToInt(),
(greDatagram.KeyPresent ? "Key" : "No key")));
innerFields[3].AssertShow(string.Format("...{0} .... .... .... = {1}", greDatagram.SequenceNumberPresent.ToInt(),
innerFields[currentInnerFieldIndex++].AssertShow(string.Format("...{0} .... .... .... = {1}", greDatagram.SequenceNumberPresent.ToInt(),
(greDatagram.SequenceNumberPresent ? "Sequence number" : "No sequence number")));
innerFields[4].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")));
innerFields[5].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()).
SequenceToString(),
greDatagram.RecursionControl));
innerFields[6].AssertShow(string.Format(".... .... {0}... = Flags: {1}",
greDatagram.Flags.ToBits().Skip(3).Select(b => b.ToInt()).SequenceToString().
Insert(4, " "),
if (isEnhanced)
{
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .... {0}... .... = {1}",
greDatagram.AcknowledgmentSequenceNumberPresent.ToInt(),
(greDatagram.AcknowledgmentSequenceNumberPresent
? "Acknowledgment number"
: "No acknowledgment number")));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .... .{0}... = Flags: {1}",
greDatagram.Flags.ToBits().Skip(3).Take(4).Select(b => b.ToInt()).
SequenceToString().
Insert(3, " "),
greDatagram.Flags));
innerFields[7].AssertShow(string.Format(".... .... .... .{0} = Version: {1}",
}
else
{
byte fullFlags = (byte)(greDatagram.Flags | (greDatagram.AcknowledgmentSequenceNumberPresent ? 0x10 : 0x00));
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .... {0}... = Flags: {1}",
fullFlags.ToBits().Skip(3).Select(b => b.ToInt()).
SequenceToString().
Insert(4, " "),
fullFlags));
}
innerFields[currentInnerFieldIndex++].AssertShow(string.Format(".... .... .... .{0} = Version: {1}",
((byte)greDatagram.Version).ToBits().Skip(5).Select(b => b.ToInt()).
SequenceToString(),
(byte)greDatagram.Version));
......@@ -888,10 +917,22 @@ namespace PcapDotNet.Core.Test
{
field.AssertValue(greDatagram.RoutingOffset);
}
else if (field.Show().StartsWith("Payload length: "))
{
field.AssertValue(greDatagram.KeyPayloadLength);
}
else if (field.Show().StartsWith("Call ID: "))
{
field.AssertValue(greDatagram.KeyCallId);
}
else if (field.Show().StartsWith("Sequence number: "))
{
field.AssertValue(greDatagram.SequenceNumber);
}
else if (field.Show().StartsWith("Acknowledgement number: "))
{
field.AssertValue(greDatagram.AcknowledgmentSequenceNumber);
}
else if (field.Show().StartsWith("Address family: "))
{
++currentEntry;
......
......@@ -583,12 +583,17 @@ namespace PcapDotNet.Packets.TestUtils
// GRE
public static GreLayer NextGreLayer(this Random random)
{
GreVersion version = random.NextEnum<GreVersion>();
bool isChecksum = random.NextBool();
bool isRouting = random.NextBool();
GreSourceRouteEntry[] routing = null;
ushort? routingOffset = null;
bool strictSourceRoute = false;
if (isRouting)
EthernetType protocolType = random.NextEnum(EthernetType.None);
uint? key = random.NextBool() ? (uint?)random.NextUInt() : null;
if (version == GreVersion.Gre)
{
if (random.NextBool())
{
strictSourceRoute = random.NextBool();
routing = new GreSourceRouteEntry[random.Next(5)];
......@@ -638,17 +643,25 @@ namespace PcapDotNet.Packets.TestUtils
routingOffset += (ushort)routing[i].Length;
}
}
}
else
{
protocolType = EthernetType.PointToPointProtocol;
isChecksum = false;
key = random.NextUInt();
}
return new GreLayer
{
Version = random.NextEnum<GreVersion>(),
ProtocolType = random.NextEnum(EthernetType.None),
Version = version,
ProtocolType = protocolType,
ChecksumPresent = isChecksum,
Checksum = isChecksum && random.NextBool() ? (ushort?)random.NextUShort() : null,
Key = random.NextBool() ? (uint?)random.NextUInt() : null,
Key = key,
SequenceNumber = random.NextBool() ? (uint?)random.NextUInt() : null,
AcknowledgmentSequenceNumber = version == GreVersion.EnhancedGre && random.NextBool() ? (uint?)random.NextUInt() : null,
RecursionControl = random.NextByte(8),
Flags = random.NextByte(32),
// Flags = random.NextByte(32),
Routing = routing == null ? null : routing.AsReadOnly(),
RoutingOffset = routingOffset,
StrictSourceRoute = strictSourceRoute,
......
......@@ -51,6 +51,10 @@ namespace PcapDotNet.Packets.Ethernet
/// </summary>
MacControl = 0x8808,
/// <summary>
/// PPP, Point-to-Point Protocol
/// </summary>
PointToPointProtocol = 0x880B,
/// <summary>
/// CobraNet
/// </summary>
CobraNet = 0x8819,
......
......@@ -16,6 +16,7 @@ namespace PcapDotNet.Packets.Gre
public ushort? Checksum { get; set; }
public uint? Key { get; set; }
public uint? SequenceNumber { get; set; }
public uint? AcknowledgmentSequenceNumber { get; set; }
public ushort? RoutingOffset { get; set; }
public ReadOnlyCollection<GreSourceRouteEntry> Routing { get; set; }
public bool StrictSourceRoute { get; set; }
......@@ -24,13 +25,13 @@ namespace PcapDotNet.Packets.Gre
{
get
{
return GreDatagram.GetHeaderLength(ChecksumPresent, Key != null, SequenceNumber != null, Routing);
return GreDatagram.GetHeaderLength(ChecksumPresent, Key != null, SequenceNumber != null, AcknowledgmentSequenceNumber != null, Routing);
}
}
public override void Write(byte[] buffer, int offset, int payloadLength, ILayer previousLayer, ILayer nextLayer)
{
GreDatagram.WriteHeader(buffer, offset, RecursionControl, Flags, Version, ProtocolType, ChecksumPresent, Key, SequenceNumber, Routing, RoutingOffset, StrictSourceRoute);
GreDatagram.WriteHeader(buffer, offset, RecursionControl, Flags, Version, ProtocolType, ChecksumPresent, Key, SequenceNumber, AcknowledgmentSequenceNumber, Routing, RoutingOffset, StrictSourceRoute);
}
public override void Finalize(byte[] buffer, int offset, int payloadLength, ILayer nextLayer)
......@@ -50,6 +51,7 @@ namespace PcapDotNet.Packets.Gre
(Checksum == null ? other.Checksum == null : Checksum.Equals(other.Checksum)) &&
(Key == null ? other.Key == null : Key.Equals(other.Key)) &&
(SequenceNumber == null ? other.SequenceNumber == null : SequenceNumber.Equals(other.SequenceNumber)) &&
(AcknowledgmentSequenceNumber == null ? other.AcknowledgmentSequenceNumber == null : AcknowledgmentSequenceNumber.Equals(other.AcknowledgmentSequenceNumber)) &&
(RoutingOffset == null ? other.RoutingOffset == null : RoutingOffset.Equals(other.RoutingOffset)) &&
(Routing == null ? other.Routing == null : Routing.SequenceEqual(other.Routing)) &&
StrictSourceRoute.Equals(other.StrictSourceRoute);
......
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