Commit e3457d59 authored by Brickner_cp's avatar Brickner_cp

GRE

Improved resharper configuration
parent 2824a1b4
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
<ANONYMOUS_METHOD_DECLARATION_BRACES>NEXT_LINE</ANONYMOUS_METHOD_DECLARATION_BRACES> <ANONYMOUS_METHOD_DECLARATION_BRACES>NEXT_LINE</ANONYMOUS_METHOD_DECLARATION_BRACES>
<CASE_BLOCK_BRACES>NEXT_LINE</CASE_BLOCK_BRACES> <CASE_BLOCK_BRACES>NEXT_LINE</CASE_BLOCK_BRACES>
<INDENT_SIZE>4</INDENT_SIZE> <INDENT_SIZE>4</INDENT_SIZE>
<INITIALIZER_BRACES>NEXT_LINE</INITIALIZER_BRACES>
<MODIFIERS_ORDER IsNull="False"> <MODIFIERS_ORDER IsNull="False">
<Item>public</Item> <Item>public</Item>
<Item>protected</Item> <Item>protected</Item>
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
using PcapDotNet.Base;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Gre; using PcapDotNet.Packets.Gre;
using PcapDotNet.Packets.Icmp; using PcapDotNet.Packets.Icmp;
...@@ -111,8 +113,107 @@ namespace PcapDotNet.Packets.Test ...@@ -111,8 +113,107 @@ namespace PcapDotNet.Packets.Test
Assert.IsNotNull(actualGre.ActiveSourceRouteEntryIndex); Assert.IsNotNull(actualGre.ActiveSourceRouteEntryIndex);
if (actualGre.ActiveSourceRouteEntryIndex < actualGre.Routing.Count) if (actualGre.ActiveSourceRouteEntryIndex < actualGre.Routing.Count)
Assert.IsNotNull(actualGre.ActiveSourceRouteEntry); Assert.IsNotNull(actualGre.ActiveSourceRouteEntry);
foreach (GreSourceRouteEntry entry in actualGre.Routing)
{
Assert.AreNotEqual(entry, 2);
switch (entry.AddressFamily)
{
case GreSourceRouteEntryAddressFamily.AsSourceRoute:
GreSourceRouteEntryAs asEntry = (GreSourceRouteEntryAs)entry;
MoreAssert.IsInRange(0, asEntry.AsNumbers.Count, asEntry.NextAsNumberIndex);
if (asEntry.NextAsNumberIndex != asEntry.AsNumbers.Count)
Assert.AreEqual(asEntry.AsNumbers[asEntry.NextAsNumberIndex], asEntry.NextAsNumber);
break;
case GreSourceRouteEntryAddressFamily.IpSourceRoute:
GreSourceRouteEntryIp ipEntry = (GreSourceRouteEntryIp)entry;
MoreAssert.IsInRange(0, ipEntry.Addresses.Count, ipEntry.NextAddressIndex);
if (ipEntry.NextAddressIndex != ipEntry.Addresses.Count)
Assert.AreEqual(ipEntry.Addresses[ipEntry.NextAddressIndex], ipEntry.NextAddress);
break;
default:
GreSourceRouteEntryUnknown unknownEntry = (GreSourceRouteEntryUnknown)entry;
MoreAssert.IsInRange(0, unknownEntry.Data.Length, unknownEntry.Offset);
break;
}
}
}
else
{
Assert.IsNull(actualGre.ActiveSourceRouteEntry);
} }
} }
} }
[TestMethod]
public void InvalidGreTest()
{
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(IpV4Protocol.Gre);
ipV4Layer.HeaderChecksum = null;
GreLayer greLayer = random.NextGreLayer();
greLayer.Checksum = null;
greLayer.Routing = new List<GreSourceRouteEntry>
{
new GreSourceRouteEntryAs(new List<ushort> {123}.AsReadOnly(), 0),
new GreSourceRouteEntryIp(new List<IpV4Address> {random.NextIpV4Address()}.AsReadOnly(),
0)
}.AsReadOnly();
PacketBuilder packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, greLayer);
Packet packet = packetBuilder.Build(DateTime.Now);
Assert.IsTrue(packet.IsValid);
GreDatagram gre = packet.Ethernet.IpV4.Gre;
// Remove a byte from routing
Datagram newIpPayload = new Datagram(gre.Take(gre.Length - 1).ToArray());
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer {Data = newIpPayload});
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
// SreLength is too big
byte[] buffer = gre.ToArray();
buffer[buffer.Length - 1] = 200;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
// SreOffset is too big
buffer = gre.ToArray();
buffer[gre.Length - 10] = 100;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
// SreOffset isn't aligned to ip
buffer = gre.ToArray();
buffer[gre.Length - 10] = 3;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
// SreOffset isn't aligned to as
buffer = gre.ToArray();
buffer[gre.Length - 16] = 1;
newIpPayload = new Datagram(buffer);
packetBuilder = new PacketBuilder(ethernetLayer, ipV4Layer, new PayloadLayer { Data = newIpPayload });
packet = packetBuilder.Build(DateTime.Now);
Assert.IsFalse(packet.IsValid);
}
} }
} }
\ No newline at end of file
...@@ -593,7 +593,12 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -593,7 +593,12 @@ namespace PcapDotNet.Packets.TestUtils
strictSourceRoute = random.NextBool(); strictSourceRoute = random.NextBool();
routing = new GreSourceRouteEntry[random.Next(5)]; routing = new GreSourceRouteEntry[random.Next(5)];
GreSourceRouteEntryAddressFamily family = random.NextEnum(GreSourceRouteEntryAddressFamily.None); GreSourceRouteEntryAddressFamily family;
if (random.NextBool())
family = random.NextEnum(GreSourceRouteEntryAddressFamily.None);
else
family = (GreSourceRouteEntryAddressFamily)random.NextUShort();
for (int i = 0; i != routing.Length; ++i) for (int i = 0; i != routing.Length; ++i)
{ {
switch (family) switch (family)
...@@ -617,7 +622,11 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -617,7 +622,11 @@ namespace PcapDotNet.Packets.TestUtils
} }
default: default:
throw new InvalidOperationException("Unknown family " + family); {
int dataLength = random.Next(1, 100);
routing[i] = new GreSourceRouteEntryUnknown(family, random.NextDatagram(dataLength), random.Next(dataLength + 1));
break;
}
} }
} }
......
...@@ -169,8 +169,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -169,8 +169,7 @@ namespace PcapDotNet.Packets.Gre
{ {
get get
{ {
if (_activeSourceRouteEntryIndex == null && RoutingPresent) TryParseRouting();
ParseRouting();
return _activeSourceRouteEntryIndex; return _activeSourceRouteEntryIndex;
} }
} }
...@@ -225,9 +224,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -225,9 +224,7 @@ namespace PcapDotNet.Packets.Gre
{ {
get get
{ {
if (_routing == null && RoutingPresent) TryParseRouting();
ParseRouting();
return _routing; return _routing;
} }
} }
...@@ -261,7 +258,7 @@ namespace PcapDotNet.Packets.Gre ...@@ -261,7 +258,7 @@ namespace PcapDotNet.Packets.Gre
protected override bool CalculateIsValid() protected override bool CalculateIsValid()
{ {
return (Length >= HeaderMinimumLength && Length >= HeaderLength && (!ChecksumPresent || IsChecksumCorrect)); return (Length >= HeaderMinimumLength && Length >= HeaderLength && IsValidRouting && (!ChecksumPresent || IsChecksumCorrect));
} }
internal GreDatagram(byte[] buffer, int offset, int length) internal GreDatagram(byte[] buffer, int offset, int length)
...@@ -342,8 +339,11 @@ namespace PcapDotNet.Packets.Gre ...@@ -342,8 +339,11 @@ namespace PcapDotNet.Packets.Gre
get { return OffsetSequenceNumber + (SequenceNumberPresent ? sizeof(uint) : 0); } get { return OffsetSequenceNumber + (SequenceNumberPresent ? sizeof(uint) : 0); }
} }
private void ParseRouting() private void TryParseRouting()
{ {
if (_routing != null || !RoutingPresent)
return;
List<GreSourceRouteEntry> entries = new List<GreSourceRouteEntry>(); List<GreSourceRouteEntry> entries = new List<GreSourceRouteEntry>();
int routingStartOffset = StartOffset + OffsetRouting; int routingStartOffset = StartOffset + OffsetRouting;
int entryOffset = routingStartOffset; int entryOffset = routingStartOffset;
...@@ -382,6 +382,16 @@ namespace PcapDotNet.Packets.Gre ...@@ -382,6 +382,16 @@ namespace PcapDotNet.Packets.Gre
return Sum16BitsToChecksum(sum); return Sum16BitsToChecksum(sum);
} }
private bool IsValidRouting
{
get
{
TryParseRouting();
return _isValidRouting;
}
}
private IpV4Datagram _ipV4; private IpV4Datagram _ipV4;
private ReadOnlyCollection<GreSourceRouteEntry> _routing; private ReadOnlyCollection<GreSourceRouteEntry> _routing;
private bool _isValidRouting = true; private bool _isValidRouting = true;
...@@ -422,7 +432,8 @@ namespace PcapDotNet.Packets.Gre ...@@ -422,7 +432,8 @@ namespace PcapDotNet.Packets.Gre
public bool Equals(GreSourceRouteEntry other) public bool Equals(GreSourceRouteEntry other)
{ {
return AddressFamily == other.AddressFamily && return other != null &&
AddressFamily == other.AddressFamily &&
Length == other.Length && Length == other.Length &&
OffsetInPayload == other.OffsetInPayload && OffsetInPayload == other.OffsetInPayload &&
EqualsPayloads(other); EqualsPayloads(other);
...@@ -633,6 +644,13 @@ namespace PcapDotNet.Packets.Gre ...@@ -633,6 +644,13 @@ namespace PcapDotNet.Packets.Gre
public class GreSourceRouteEntryUnknown : GreSourceRouteEntry public class GreSourceRouteEntryUnknown : GreSourceRouteEntry
{ {
public GreSourceRouteEntryUnknown(GreSourceRouteEntryAddressFamily addressFamily, Datagram data, int offset)
{
_addressFamily = addressFamily;
_data = data;
_offset = offset;
}
public override GreSourceRouteEntryAddressFamily AddressFamily public override GreSourceRouteEntryAddressFamily AddressFamily
{ {
get { return _addressFamily; } get { return _addressFamily; }
...@@ -668,13 +686,6 @@ namespace PcapDotNet.Packets.Gre ...@@ -668,13 +686,6 @@ namespace PcapDotNet.Packets.Gre
buffer.Write(offset, Data); buffer.Write(offset, Data);
} }
internal GreSourceRouteEntryUnknown(GreSourceRouteEntryAddressFamily addressFamily, Datagram data, int offset)
{
_addressFamily = addressFamily;
_data = data;
_offset = offset;
}
private readonly GreSourceRouteEntryAddressFamily _addressFamily; private readonly GreSourceRouteEntryAddressFamily _addressFamily;
private readonly Datagram _data; private readonly Datagram _data;
private readonly int _offset; private readonly int _offset;
......
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