Common: Add a PCAP writer module
This commit is contained in:
parent
3c51c75b3e
commit
ce74752e91
|
@ -14,6 +14,7 @@ set(SRCS BreakPoints.cpp
|
||||||
MsgHandler.cpp
|
MsgHandler.cpp
|
||||||
NandPaths.cpp
|
NandPaths.cpp
|
||||||
Network.cpp
|
Network.cpp
|
||||||
|
PcapFile.cpp
|
||||||
SettingsHandler.cpp
|
SettingsHandler.cpp
|
||||||
SDCardUtil.cpp
|
SDCardUtil.cpp
|
||||||
StringUtil.cpp
|
StringUtil.cpp
|
||||||
|
|
|
@ -78,6 +78,7 @@
|
||||||
<ClInclude Include="MsgHandler.h" />
|
<ClInclude Include="MsgHandler.h" />
|
||||||
<ClInclude Include="NandPaths.h" />
|
<ClInclude Include="NandPaths.h" />
|
||||||
<ClInclude Include="Network.h" />
|
<ClInclude Include="Network.h" />
|
||||||
|
<ClInclude Include="PcapFile.h" />
|
||||||
<ClInclude Include="SDCardUtil.h" />
|
<ClInclude Include="SDCardUtil.h" />
|
||||||
<ClInclude Include="SettingsHandler.h" />
|
<ClInclude Include="SettingsHandler.h" />
|
||||||
<ClInclude Include="stdafx.h" />
|
<ClInclude Include="stdafx.h" />
|
||||||
|
@ -114,6 +115,7 @@
|
||||||
<ClCompile Include="MsgHandler.cpp" />
|
<ClCompile Include="MsgHandler.cpp" />
|
||||||
<ClCompile Include="NandPaths.cpp" />
|
<ClCompile Include="NandPaths.cpp" />
|
||||||
<ClCompile Include="Network.cpp" />
|
<ClCompile Include="Network.cpp" />
|
||||||
|
<ClCompile Include="PcapFile.cpp" />
|
||||||
<ClCompile Include="SDCardUtil.cpp" />
|
<ClCompile Include="SDCardUtil.cpp" />
|
||||||
<ClCompile Include="SettingsHandler.cpp" />
|
<ClCompile Include="SettingsHandler.cpp" />
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
<ClInclude Include="MsgHandler.h" />
|
<ClInclude Include="MsgHandler.h" />
|
||||||
<ClInclude Include="NandPaths.h" />
|
<ClInclude Include="NandPaths.h" />
|
||||||
<ClInclude Include="Network.h" />
|
<ClInclude Include="Network.h" />
|
||||||
|
<ClInclude Include="PcapFile.h" />
|
||||||
<ClInclude Include="SDCardUtil.h" />
|
<ClInclude Include="SDCardUtil.h" />
|
||||||
<ClInclude Include="SettingsHandler.h" />
|
<ClInclude Include="SettingsHandler.h" />
|
||||||
<ClInclude Include="StdConditionVariable.h" />
|
<ClInclude Include="StdConditionVariable.h" />
|
||||||
|
@ -86,6 +87,7 @@
|
||||||
<ClCompile Include="MsgHandler.cpp" />
|
<ClCompile Include="MsgHandler.cpp" />
|
||||||
<ClCompile Include="NandPaths.cpp" />
|
<ClCompile Include="NandPaths.cpp" />
|
||||||
<ClCompile Include="Network.cpp" />
|
<ClCompile Include="Network.cpp" />
|
||||||
|
<ClCompile Include="PcapFile.cpp" />
|
||||||
<ClCompile Include="SDCardUtil.cpp" />
|
<ClCompile Include="SDCardUtil.cpp" />
|
||||||
<ClCompile Include="SettingsHandler.cpp" />
|
<ClCompile Include="SettingsHandler.cpp" />
|
||||||
<ClCompile Include="StringUtil.cpp" />
|
<ClCompile Include="StringUtil.cpp" />
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
// Copyright 2014 Dolphin Emulator Project
|
||||||
|
// Licensed under GPLv2
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#include "Common/CommonTypes.h"
|
||||||
|
#include "Common/FileUtil.h"
|
||||||
|
#include "Common/PcapFile.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const u32 PCAP_MAGIC = 0xa1b2c3d4;
|
||||||
|
const u16 PCAP_VERSION_MAJOR = 2;
|
||||||
|
const u16 PCAP_VERSION_MINOR = 4;
|
||||||
|
const u32 PCAP_CAPTURE_LENGTH = 65535;
|
||||||
|
|
||||||
|
// TODO(delroth): Make this configurable at PCAP creation time?
|
||||||
|
const u32 PCAP_DATA_LINK_TYPE = 147; // Reserved for internal use.
|
||||||
|
|
||||||
|
// Designed to be directly written into the PCAP file. The PCAP format is
|
||||||
|
// endian independent, so this works just fine.
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
struct PCAPHeader
|
||||||
|
{
|
||||||
|
u32 magic_number;
|
||||||
|
u16 version_major;
|
||||||
|
u16 version_minor;
|
||||||
|
s32 tz_offset; // Offset in seconds from the GMT timezone.
|
||||||
|
u32 ts_accuracy; // In practice, 0.
|
||||||
|
u32 capture_length; // Size at which we truncate packets.
|
||||||
|
u32 data_link_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PCAPRecordHeader
|
||||||
|
{
|
||||||
|
u32 ts_sec;
|
||||||
|
u32 ts_usec;
|
||||||
|
u32 size_in_file; // Size after eventual truncation.
|
||||||
|
u32 real_size; // Size before eventual truncation.
|
||||||
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void PCAP::AddHeader()
|
||||||
|
{
|
||||||
|
PCAPHeader hdr = {
|
||||||
|
PCAP_MAGIC, PCAP_VERSION_MAJOR, PCAP_VERSION_MINOR,
|
||||||
|
0, 0, PCAP_CAPTURE_LENGTH, PCAP_DATA_LINK_TYPE
|
||||||
|
};
|
||||||
|
m_fp->WriteBytes(&hdr, sizeof (hdr));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PCAP::AddPacket(const u8* bytes, size_t size)
|
||||||
|
{
|
||||||
|
std::chrono::system_clock::time_point now(std::chrono::system_clock::now());
|
||||||
|
auto ts = now.time_since_epoch();
|
||||||
|
PCAPRecordHeader rec_hdr = {
|
||||||
|
(u32)std::chrono::duration_cast<std::chrono::seconds>(ts).count(),
|
||||||
|
(u32)(std::chrono::duration_cast<std::chrono::microseconds>(ts).count() % 1000000),
|
||||||
|
(u32)size, (u32)size
|
||||||
|
};
|
||||||
|
m_fp->WriteBytes(&rec_hdr, sizeof (rec_hdr));
|
||||||
|
m_fp->WriteBytes(bytes, size);
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright 2014 Dolphin Emulator Project
|
||||||
|
// Licensed under GPLv2
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
// PCAP is a standard file format for network capture files. This also extends
|
||||||
|
// to any capture of packetized intercommunication data. This file provides a
|
||||||
|
// class called PCAP which is a very light wrapper around the file format,
|
||||||
|
// allowing only creating a new PCAP capture file and appending packets to it.
|
||||||
|
//
|
||||||
|
// Example use:
|
||||||
|
// PCAP pcap(new IOFile("test.pcap", "wb"));
|
||||||
|
// pcap.AddPacket(pkt); // pkt is automatically casted to u8*
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "Common/CommonTypes.h"
|
||||||
|
#include "Common/FileUtil.h"
|
||||||
|
|
||||||
|
class PCAP final : public NonCopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Takes ownership of the file object. Assumes the file object is already
|
||||||
|
// opened in write mode.
|
||||||
|
explicit PCAP(File::IOFile* fp) : m_fp(fp)
|
||||||
|
{
|
||||||
|
AddHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void AddPacket(const T& obj)
|
||||||
|
{
|
||||||
|
AddPacket(reinterpret_cast<const u8*>(&obj), sizeof (obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddPacket(const u8* bytes, size_t size);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void AddHeader();
|
||||||
|
|
||||||
|
std::unique_ptr<File::IOFile> m_fp;
|
||||||
|
};
|
Loading…
Reference in New Issue