Commit f66abd8c authored by Brickner_cp's avatar Brickner_cp

--no commit message

--no commit message
parent 9443a5b3
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
using Packets; using Packets;
...@@ -60,13 +61,13 @@ namespace PcapDotNet.Core.Test ...@@ -60,13 +61,13 @@ namespace PcapDotNet.Core.Test
#endregion #endregion
[TestMethod] [TestMethod]
public void DumpPacketsTest() public void GetPacketTest()
{ {
const string SourceMac = "11:22:33:44:55:66"; const string SourceMac = "11:22:33:44:55:66";
const string DestinationMac = "77:88:99:AA:BB:CC"; const string DestinationMac = "77:88:99:AA:BB:CC";
const int NumPackets = 10; const int NumPackets = 10;
Packet expectedPacket = MoreRandom.BuildRandomPacket(SourceMac, DestinationMac, 24); Packet expectedPacket = MoreRandom.BuildRandomPacket(SourceMac, DestinationMac, 100);
using (PacketCommunicator communicator = OpenOfflineDevice(NumPackets, expectedPacket)) using (PacketCommunicator communicator = OpenOfflineDevice(NumPackets, expectedPacket))
{ {
...@@ -90,13 +91,47 @@ namespace PcapDotNet.Core.Test ...@@ -90,13 +91,47 @@ namespace PcapDotNet.Core.Test
} }
[TestMethod] [TestMethod]
public void SetNonBlockTest() public void GetSomePacketsTest()
{ {
const int NumPackets = 10; const int NumPacketsToSend = 100;
// Normal
TestGetSomePackets(NumPacketsToSend, NumPacketsToSend, int.MaxValue, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend, 0.05, 0.05);
TestGetSomePackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0.05, 0.05);
// Eof
TestGetSomePackets(NumPacketsToSend, 0, int.MaxValue, PacketCommunicatorReceiveResult.Eof, NumPacketsToSend, 0.05, 0.05);
TestGetSomePackets(NumPacketsToSend, -1, int.MaxValue, PacketCommunicatorReceiveResult.Eof, NumPacketsToSend, 0.05, 0.05);
TestGetSomePackets(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, PacketCommunicatorReceiveResult.Eof, NumPacketsToSend, 0.05, 0.05);
Packet packet = MoreRandom.BuildRandomPacket(24); // Break loop
TestGetSomePackets(NumPacketsToSend, NumPacketsToSend, NumPacketsToSend / 2, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0.05, 0.05);
TestGetSomePackets(NumPacketsToSend, NumPacketsToSend, 0, PacketCommunicatorReceiveResult.BreakLoop, 0, 0.05, 0.05);
}
[TestMethod]
public void GetPacketsTest()
{
const int NumPacketsToSend = 100;
using (PacketCommunicator communicator = OpenOfflineDevice(NumPackets, packet)) // Normal
TestGetPackets(NumPacketsToSend, NumPacketsToSend, int.MaxValue, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend, 0.05, 0.05);
TestGetPackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0.05, 0.05);
// Eof
TestGetPackets(NumPacketsToSend, 0, int.MaxValue, PacketCommunicatorReceiveResult.Eof, NumPacketsToSend, 0.05, 0.05);
TestGetPackets(NumPacketsToSend, -1, int.MaxValue, PacketCommunicatorReceiveResult.Eof, NumPacketsToSend, 0.05, 0.05);
TestGetPackets(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, PacketCommunicatorReceiveResult.Eof, NumPacketsToSend, 0.05, 0.05);
// Break loop
TestGetPackets(NumPacketsToSend, NumPacketsToSend, NumPacketsToSend / 2, PacketCommunicatorReceiveResult.BreakLoop, NumPacketsToSend / 2, 0.05, 0.05);
TestGetPackets(NumPacketsToSend, NumPacketsToSend, 0, PacketCommunicatorReceiveResult.BreakLoop, 0, 0.05, 0.05);
}
[TestMethod]
public void SetNonBlockTest()
{
using (PacketCommunicator communicator = OpenOfflineDevice())
{ {
Assert.AreEqual(false, communicator.NonBlocking); Assert.AreEqual(false, communicator.NonBlocking);
communicator.NonBlocking = false; communicator.NonBlocking = false;
...@@ -108,13 +143,9 @@ namespace PcapDotNet.Core.Test ...@@ -108,13 +143,9 @@ namespace PcapDotNet.Core.Test
[TestMethod] [TestMethod]
[ExpectedException(typeof(InvalidOperationException))] [ExpectedException(typeof(InvalidOperationException))]
public void GetTotalStatisticsTest() public void GetTotalStatisticsErrorTest()
{ {
const int NumPackets = 10; using (PacketCommunicator communicator = OpenOfflineDevice())
Packet packet = MoreRandom.BuildRandomPacket(24);
using (PacketCommunicator communicator = OpenOfflineDevice(NumPackets, packet))
{ {
Assert.IsNotNull(communicator.TotalStatistics); Assert.IsNotNull(communicator.TotalStatistics);
} }
...@@ -129,7 +160,87 @@ namespace PcapDotNet.Core.Test ...@@ -129,7 +160,87 @@ namespace PcapDotNet.Core.Test
} }
} }
public static PacketCommunicator OpenOfflineDevice(int numPackets, Packet packet) [TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void SendPacketTest()
{
using (PacketCommunicator communicator = OpenOfflineDevice())
{
communicator.SendPacket(MoreRandom.BuildRandomPacket(100));
}
}
private static void TestGetSomePackets(int numPacketsToSend, int numPacketsToGet, int numPacketsToBreakLoop,
PacketCommunicatorReceiveResult expectedResult, int expectedNumPackets,
double expectedMinSeconds, double expectedMaxSeconds)
{
string TestDescription = "NumPacketsToSend=" + numPacketsToSend + ". NumPacketsToGet=" + numPacketsToGet +
". NumPacketsToBreakLoop=" + numPacketsToBreakLoop;
const string SourceMac = "11:22:33:44:55:66";
const string DestinationMac = "77:88:99:AA:BB:CC";
Packet expectedPacket = MoreRandom.BuildRandomPacket(SourceMac, DestinationMac, 100);
using (PacketCommunicator communicator = OpenOfflineDevice(numPacketsToSend, expectedPacket))
{
communicator.SetFilter("ether src " + SourceMac + " and ether dst " + DestinationMac);
if (numPacketsToBreakLoop == 0)
communicator.Break();
PacketHandler handler = new PacketHandler(expectedPacket, expectedMinSeconds, expectedMaxSeconds, communicator, numPacketsToBreakLoop);
int numPacketsGot;
PacketCommunicatorReceiveResult result = communicator.GetSomePackets(out numPacketsGot, numPacketsToGet, handler.Handle);
Assert.AreEqual(expectedResult, result);
Assert.AreEqual(expectedNumPackets, numPacketsGot, "NumPacketsGot. Test: " + TestDescription);
Assert.AreEqual(expectedNumPackets, handler.NumPacketsHandled, "NumPacketsHandled. Test: " + TestDescription);
}
}
private static void TestGetPackets(int numPacketsToSend, int numPacketsToGet, int numPacketsToBreakLoop,
PacketCommunicatorReceiveResult expectedResult, int expectedNumPackets,
double expectedMinSeconds, double expectedMaxSeconds)
{
string TestDescription = "NumPacketsToSend=" + numPacketsToSend + ". NumPacketsToGet=" + numPacketsToGet +
". NumPacketsToBreakLoop=" + numPacketsToBreakLoop;
const string SourceMac = "11:22:33:44:55:66";
const string DestinationMac = "77:88:99:AA:BB:CC";
Packet expectedPacket = MoreRandom.BuildRandomPacket(SourceMac, DestinationMac, 24);
using (PacketCommunicator communicator = OpenOfflineDevice(numPacketsToSend, expectedPacket))
{
communicator.SetFilter("ether src " + SourceMac + " and ether dst " + DestinationMac);
if (numPacketsToBreakLoop == 0)
communicator.Break();
PacketHandler handler = new PacketHandler(expectedPacket, expectedMinSeconds, expectedMaxSeconds, communicator, numPacketsToBreakLoop);
PacketCommunicatorReceiveResult result = PacketCommunicatorReceiveResult.None;
Thread thread = new Thread(delegate()
{
result = communicator.GetPackets(numPacketsToGet, handler.Handle);
});
thread.Start();
if (!thread.Join(TimeSpan.FromSeconds(5)))
{
thread.Abort();
}
Assert.AreEqual(expectedResult, result, TestDescription);
Assert.AreEqual(expectedNumPackets, handler.NumPacketsHandled);
}
}
private static PacketCommunicator OpenOfflineDevice()
{
return OpenOfflineDevice(10, MoreRandom.BuildRandomPacket(100));
}
private static PacketCommunicator OpenOfflineDevice(int numPackets, Packet packet)
{ {
string dumpFilename = Path.GetTempPath() + @"dump.pcap"; string dumpFilename = Path.GetTempPath() + @"dump.pcap";
......
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Packets;
namespace PcapDotNet.Core.Test
{
internal class PacketHandler
{
public PacketHandler(Packet expectedPacket, DateTime expectedMinTimestamp, DateTime expectedMaxTimestamp,
PacketCommunicator communicator, int numPacketsToBreakLoop)
{
_expectedPacket = expectedPacket;
_expectedMinTimestamp = expectedMinTimestamp;
_expectedMaxTimestamp = expectedMaxTimestamp;
_communicator = communicator;
_numPacketsToBreakLoop = numPacketsToBreakLoop;
}
public PacketHandler(Packet expectedPacket, double expectedSecondsBefore, double expectedSecondsAfter, PacketCommunicator communicator, int numPacketsToBreakLoop)
: this(expectedPacket, expectedPacket.Timestamp.AddSeconds(-expectedSecondsBefore), expectedPacket.Timestamp.AddSeconds(expectedSecondsAfter), communicator, numPacketsToBreakLoop)
{
}
public void Handle(Packet packet)
{
Assert.AreEqual(_expectedPacket, packet);
MoreAssert.IsInRange(_expectedMinTimestamp, _expectedMaxTimestamp, packet.Timestamp);
++_numPacketsHandled;
if (NumPacketsHandled >= _numPacketsToBreakLoop)
_communicator.Break();
}
public int NumPacketsHandled
{
get { return _numPacketsHandled; }
}
private readonly Packet _expectedPacket;
private readonly DateTime _expectedMinTimestamp;
private readonly DateTime _expectedMaxTimestamp;
private readonly PacketCommunicator _communicator;
private readonly int _numPacketsToBreakLoop = int.MaxValue;
private int _numPacketsHandled; // = 0;
}
}
\ No newline at end of file
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
<Compile Include="MoreAssert.cs" /> <Compile Include="MoreAssert.cs" />
<Compile Include="LivePacketDeviceTests.cs" /> <Compile Include="LivePacketDeviceTests.cs" />
<Compile Include="MoreRandom.cs" /> <Compile Include="MoreRandom.cs" />
<Compile Include="PacketHandler.cs" />
<Compile Include="PacketSendQueueTests.cs" /> <Compile Include="PacketSendQueueTests.cs" />
<Compile Include="OfflinePacketDeviceTests.cs" /> <Compile Include="OfflinePacketDeviceTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
......
#include "OnlinePacketCommunicator.h" #include "LivePacketCommunicator.h"
#include "Pcap.h" #include "Pcap.h"
using namespace PcapDotNet::Core; using namespace PcapDotNet::Core;
OnlinePacketCommunicator::OnlinePacketCommunicator(const char* source, int snapshotLength, PacketDeviceOpenFlags flags, int readTimeout, pcap_rmtauth* auth, SocketAddress^ netmask) LivePacketCommunicator::LivePacketCommunicator(const char* source, int snapshotLength, PacketDeviceOpenFlags flags, int readTimeout, pcap_rmtauth* auth, SocketAddress^ netmask)
: PacketCommunicator(source, snapshotLength, flags, readTimeout, auth, netmask) : PacketCommunicator(source, snapshotLength, flags, readTimeout, auth, netmask)
{ {
} }
PacketTotalStatistics^ OnlinePacketCommunicator::TotalStatistics::get() PacketTotalStatistics^ LivePacketCommunicator::TotalStatistics::get()
{ {
int statisticsSize; int statisticsSize;
pcap_stat* statistics = pcap_stats_ex(_pcapDescriptor, &statisticsSize); pcap_stat* statistics = pcap_stats_ex(_pcapDescriptor, &statisticsSize);
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
namespace PcapDotNet { namespace Core namespace PcapDotNet { namespace Core
{ {
public ref class OnlinePacketCommunicator : PacketCommunicator public ref class LivePacketCommunicator : PacketCommunicator
{ {
public: public:
virtual property PacketTotalStatistics^ TotalStatistics virtual property PacketTotalStatistics^ TotalStatistics
...@@ -13,8 +13,8 @@ namespace PcapDotNet { namespace Core ...@@ -13,8 +13,8 @@ namespace PcapDotNet { namespace Core
} }
internal: internal:
OnlinePacketCommunicator(const char* source, int snapshotLength, PacketDeviceOpenFlags flags, int readTimeout, pcap_rmtauth* auth, LivePacketCommunicator(const char* source, int snapshotLength, PacketDeviceOpenFlags flags, int readTimeout, pcap_rmtauth* auth,
SocketAddress^ netmask); SocketAddress^ netmask);
}; };
}} }}
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "MarshalingServices.h" #include "MarshalingServices.h"
#include "Pcap.h" #include "Pcap.h"
#include "OnlinePacketCommunicator.h" #include "LivePacketCommunicator.h"
using namespace System; using namespace System;
using namespace System::Collections::Generic; using namespace System::Collections::Generic;
...@@ -82,7 +82,7 @@ PacketCommunicator^ LivePacketDevice::Open(int snapshotLength, PacketDeviceOpenF ...@@ -82,7 +82,7 @@ PacketCommunicator^ LivePacketDevice::Open(int snapshotLength, PacketDeviceOpenF
netmask = Addresses[0]->Netmask; netmask = Addresses[0]->Netmask;
// Open the device // Open the device
return gcnew OnlinePacketCommunicator(deviceName.c_str(), snapshotLength, flags, readTimeout, NULL, netmask); return gcnew LivePacketCommunicator(deviceName.c_str(), snapshotLength, flags, readTimeout, NULL, netmask);
} }
// Private Methods // Private Methods
......
...@@ -148,13 +148,21 @@ PacketCommunicatorReceiveResult PacketCommunicator::GetSomePackets([Out] int% nu ...@@ -148,13 +148,21 @@ PacketCommunicatorReceiveResult PacketCommunicator::GetSomePackets([Out] int% nu
functionPointer, functionPointer,
NULL); NULL);
if (numPacketsGot == -1) switch (numPacketsGot)
throw BuildInvalidOperation("Failed reading from device");
if (numPacketsGot == -2)
{ {
case -2:
numPacketsGot = 0; numPacketsGot = 0;
return PacketCommunicatorReceiveResult::BreakLoop; return PacketCommunicatorReceiveResult::BreakLoop;
case -1:
throw BuildInvalidOperation("Failed reading from device");
case 0:
if (packetHandler->PacketCounter != 0)
{
numPacketsGot = packetHandler->PacketCounter;
return PacketCommunicatorReceiveResult::Eof;
}
} }
return PacketCommunicatorReceiveResult::Ok; return PacketCommunicatorReceiveResult::Ok;
} }
...@@ -167,10 +175,17 @@ PacketCommunicatorReceiveResult PacketCommunicator::GetPackets(int numPackets, H ...@@ -167,10 +175,17 @@ PacketCommunicatorReceiveResult PacketCommunicator::GetPackets(int numPackets, H
pcap_handler functionPointer = (pcap_handler)Marshal::GetFunctionPointerForDelegate(packetHandlerDelegate).ToPointer(); pcap_handler functionPointer = (pcap_handler)Marshal::GetFunctionPointerForDelegate(packetHandlerDelegate).ToPointer();
int result = pcap_loop(_pcapDescriptor, numPackets, functionPointer, NULL); int result = pcap_loop(_pcapDescriptor, numPackets, functionPointer, NULL);
if (result == -1) switch (result)
throw BuildInvalidOperation("Failed reading from device"); {
if (result == -2) case -2:
return PacketCommunicatorReceiveResult::BreakLoop; return PacketCommunicatorReceiveResult::BreakLoop;
case -1:
throw BuildInvalidOperation("Failed reading from device");
case 0:
if (packetHandler->PacketCounter != numPackets)
return PacketCommunicatorReceiveResult::Eof;
}
return PacketCommunicatorReceiveResult::Ok; return PacketCommunicatorReceiveResult::Ok;
} }
...@@ -315,9 +330,15 @@ InvalidOperationException^ PacketCommunicator::BuildInvalidOperation(System::Str ...@@ -315,9 +330,15 @@ InvalidOperationException^ PacketCommunicator::BuildInvalidOperation(System::Str
void PacketCommunicator::PacketHandler::Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData) void PacketCommunicator::PacketHandler::Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData)
{ {
++_packetCounter;
_callBack->Invoke(CreatePacket(*packetHeader, packetData, _dataLink)); _callBack->Invoke(CreatePacket(*packetHeader, packetData, _dataLink));
} }
int PacketCommunicator::PacketHandler::PacketCounter::get()
{
return _packetCounter;
}
void PacketCommunicator::StatisticsHandler::Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData) void PacketCommunicator::StatisticsHandler::Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData)
{ {
_callBack->Invoke(CreateStatistics(*packetHeader, packetData)); _callBack->Invoke(CreateStatistics(*packetHeader, packetData));
......
...@@ -115,8 +115,15 @@ namespace PcapDotNet { namespace Core ...@@ -115,8 +115,15 @@ namespace PcapDotNet { namespace Core
void Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData); void Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData);
property int PacketCounter
{
int get();
}
private:
HandlePacket^ _callBack; HandlePacket^ _callBack;
PcapDataLink _dataLink; PcapDataLink _dataLink;
int _packetCounter;
}; };
ref class StatisticsHandler ref class StatisticsHandler
...@@ -129,6 +136,7 @@ namespace PcapDotNet { namespace Core ...@@ -129,6 +136,7 @@ namespace PcapDotNet { namespace Core
void Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData); void Handle(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData);
private:
HandleStatistics^ _callBack; HandleStatistics^ _callBack;
}; };
......
...@@ -53,11 +53,15 @@ String^ PacketTotalStatistics::ToString() ...@@ -53,11 +53,15 @@ String^ PacketTotalStatistics::ToString()
StringBuilder^ stringBuilder = gcnew StringBuilder(); StringBuilder^ stringBuilder = gcnew StringBuilder();
stringBuilder->Append("Packets Received: "); stringBuilder->Append("Packets Received: ");
stringBuilder->Append(PacketsReceived); stringBuilder->Append(PacketsReceived);
stringBuilder->Append(". ");
stringBuilder->Append("Packets Dropped By Driver: "); stringBuilder->Append("Packets Dropped By Driver: ");
stringBuilder->Append(PacketsDroppedByDriver); stringBuilder->Append(PacketsDroppedByDriver);
stringBuilder->Append(". ");
stringBuilder->Append("Packets Dropped By Interface: "); stringBuilder->Append("Packets Dropped By Interface: ");
stringBuilder->Append(PacketsDroppedByInterface); stringBuilder->Append(PacketsDroppedByInterface);
stringBuilder->Append(". ");
stringBuilder->Append("Packets Captured: "); stringBuilder->Append("Packets Captured: ");
stringBuilder->Append(PacketsCaptured); stringBuilder->Append(PacketsCaptured);
stringBuilder->Append(".");
return stringBuilder->ToString(); return stringBuilder->ToString();
} }
\ No newline at end of file
...@@ -267,19 +267,19 @@ ...@@ -267,19 +267,19 @@
Name="PacketCommunicator" Name="PacketCommunicator"
> >
<File <File
RelativePath=".\OfflinePacketCommunicator.cpp" RelativePath=".\LivePacketCommunicator.cpp"
> >
</File> </File>
<File <File
RelativePath=".\OfflinePacketCommunicator.h" RelativePath=".\LivePacketCommunicator.h"
> >
</File> </File>
<File <File
RelativePath=".\OnlinePacketCommunicator.cpp" RelativePath=".\OfflinePacketCommunicator.cpp"
> >
</File> </File>
<File <File
RelativePath=".\OnlinePacketCommunicator.h" RelativePath=".\OfflinePacketCommunicator.h"
> >
</File> </File>
<File <File
......
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