Commit e3457d59 authored by Brickner_cp's avatar Brickner_cp

GRE

Improved resharper configuration
parent 2824a1b4
......@@ -8,6 +8,7 @@
<ANONYMOUS_METHOD_DECLARATION_BRACES>NEXT_LINE</ANONYMOUS_METHOD_DECLARATION_BRACES>
<CASE_BLOCK_BRACES>NEXT_LINE</CASE_BLOCK_BRACES>
<INDENT_SIZE>4</INDENT_SIZE>
<INITIALIZER_BRACES>NEXT_LINE</INITIALIZER_BRACES>
<MODIFIERS_ORDER IsNull="False">
<Item>public</Item>
<Item>protected</Item>
......
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PcapDotNet.Base;
using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Gre;
using PcapDotNet.Packets.Icmp;
......@@ -111,8 +113,107 @@ namespace PcapDotNet.Packets.Test
Assert.IsNotNull(actualGre.ActiveSourceRouteEntryIndex);
if (actualGre.ActiveSourceRouteEntryIndex < actualGre.Routing.Count)
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
strictSourceRoute = random.NextBool();
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)
{
switch (family)
......@@ -617,7 +622,11 @@ namespace PcapDotNet.Packets.TestUtils
}
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
{
get
{
if (_activeSourceRouteEntryIndex == null && RoutingPresent)
ParseRouting();
TryParseRouting();
return _activeSourceRouteEntryIndex;
}
}
......@@ -225,9 +224,7 @@ namespace PcapDotNet.Packets.Gre
{
get
{
if (_routing == null && RoutingPresent)
ParseRouting();
TryParseRouting();
return _routing;
}
}
......@@ -261,7 +258,7 @@ namespace PcapDotNet.Packets.Gre
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)
......@@ -342,8 +339,11 @@ namespace PcapDotNet.Packets.Gre
get { return OffsetSequenceNumber + (SequenceNumberPresent ? sizeof(uint) : 0); }
}
private void ParseRouting()
private void TryParseRouting()
{
if (_routing != null || !RoutingPresent)
return;
List<GreSourceRouteEntry> entries = new List<GreSourceRouteEntry>();
int routingStartOffset = StartOffset + OffsetRouting;
int entryOffset = routingStartOffset;
......@@ -382,6 +382,16 @@ namespace PcapDotNet.Packets.Gre
return Sum16BitsToChecksum(sum);
}
private bool IsValidRouting
{
get
{
TryParseRouting();
return _isValidRouting;
}
}
private IpV4Datagram _ipV4;
private ReadOnlyCollection<GreSourceRouteEntry> _routing;
private bool _isValidRouting = true;
......@@ -422,7 +432,8 @@ namespace PcapDotNet.Packets.Gre
public bool Equals(GreSourceRouteEntry other)
{
return AddressFamily == other.AddressFamily &&
return other != null &&
AddressFamily == other.AddressFamily &&
Length == other.Length &&
OffsetInPayload == other.OffsetInPayload &&
EqualsPayloads(other);
......@@ -633,6 +644,13 @@ namespace PcapDotNet.Packets.Gre
public class GreSourceRouteEntryUnknown : GreSourceRouteEntry
{
public GreSourceRouteEntryUnknown(GreSourceRouteEntryAddressFamily addressFamily, Datagram data, int offset)
{
_addressFamily = addressFamily;
_data = data;
_offset = offset;
}
public override GreSourceRouteEntryAddressFamily AddressFamily
{
get { return _addressFamily; }
......@@ -668,13 +686,6 @@ namespace PcapDotNet.Packets.Gre
buffer.Write(offset, Data);
}
internal GreSourceRouteEntryUnknown(GreSourceRouteEntryAddressFamily addressFamily, Datagram data, int offset)
{
_addressFamily = addressFamily;
_data = data;
_offset = offset;
}
private readonly GreSourceRouteEntryAddressFamily _addressFamily;
private readonly Datagram _data;
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