add ability to pass a header to pcap file object
This commit is contained in:
@@ -16,9 +16,12 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "pcap-file-object.h"
|
||||
#include "ns3/log.h"
|
||||
|
||||
#include "buffer.h"
|
||||
#include "header.h"
|
||||
#include "pcap-file-object.h"
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("PcapFileObject");
|
||||
|
||||
namespace ns3 {
|
||||
@@ -48,19 +51,19 @@ PcapFileObject::~PcapFileObject ()
|
||||
void
|
||||
PcapFileObject::Close (void)
|
||||
{
|
||||
file.Close ();
|
||||
m_file.Close ();
|
||||
}
|
||||
|
||||
bool
|
||||
PcapFileObject::Open (std::string const &filename, std::string const &mode)
|
||||
{
|
||||
return file.Open (filename, mode);
|
||||
return m_file.Open (filename, mode);
|
||||
}
|
||||
|
||||
bool
|
||||
PcapFileObject::Init (uint32_t dataLinkType, uint32_t snapLen, int32_t tzCorrection)
|
||||
{
|
||||
return file.Init (dataLinkType, snapLen, tzCorrection);
|
||||
return m_file.Init (dataLinkType, snapLen, tzCorrection);
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -73,7 +76,32 @@ PcapFileObject::Write (Time t, Ptr<const Packet> p)
|
||||
uint32_t bufferSize = p->GetSize ();
|
||||
uint8_t *buffer = new uint8_t[bufferSize];
|
||||
p->CopyData (buffer, bufferSize);
|
||||
bool rc = file.Write (s, us, buffer, bufferSize);
|
||||
bool rc = m_file.Write (s, us, buffer, bufferSize);
|
||||
delete [] buffer;
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool
|
||||
PcapFileObject::Write (Time t, Header &header, Ptr<const Packet> p)
|
||||
{
|
||||
uint64_t current = t.GetMicroSeconds ();
|
||||
uint64_t s = current / 1000000;
|
||||
uint64_t us = current % 1000000;
|
||||
|
||||
Buffer headerBuffer;
|
||||
uint32_t headerSize = header.GetSerializedSize ();
|
||||
uint32_t packetSize = p->GetSize ();
|
||||
uint32_t bufferSize = headerSize + packetSize;
|
||||
|
||||
headerBuffer.AddAtStart (headerSize);
|
||||
header.Serialize (headerBuffer.Begin ());
|
||||
|
||||
uint8_t *buffer = new uint8_t[bufferSize];
|
||||
|
||||
headerBuffer.Begin ().Read (buffer, headerSize);
|
||||
p->CopyData (&buffer[headerSize], packetSize);
|
||||
bool rc = m_file.Write (s, us, buffer, bufferSize);
|
||||
|
||||
delete [] buffer;
|
||||
return rc;
|
||||
}
|
||||
@@ -85,49 +113,49 @@ PcapFileObject::Write (Time t, uint8_t const *buffer, uint32_t length)
|
||||
uint64_t s = current / 1000000;
|
||||
uint64_t us = current % 1000000;
|
||||
|
||||
return file.Write (s, us, buffer, length);
|
||||
return m_file.Write (s, us, buffer, length);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
PcapFileObject::GetMagic (void)
|
||||
{
|
||||
return file.GetMagic ();
|
||||
return m_file.GetMagic ();
|
||||
}
|
||||
|
||||
uint16_t
|
||||
PcapFileObject::GetVersionMajor (void)
|
||||
{
|
||||
return file.GetVersionMajor ();
|
||||
return m_file.GetVersionMajor ();
|
||||
}
|
||||
|
||||
uint16_t
|
||||
PcapFileObject::GetVersionMinor (void)
|
||||
{
|
||||
return file.GetVersionMinor ();
|
||||
return m_file.GetVersionMinor ();
|
||||
}
|
||||
|
||||
int32_t
|
||||
PcapFileObject::GetTimeZoneOffset (void)
|
||||
{
|
||||
return file.GetTimeZoneOffset ();
|
||||
return m_file.GetTimeZoneOffset ();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
PcapFileObject::GetSigFigs (void)
|
||||
{
|
||||
return file.GetSigFigs ();
|
||||
return m_file.GetSigFigs ();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
PcapFileObject::GetSnapLen (void)
|
||||
{
|
||||
return file.GetSnapLen ();
|
||||
return m_file.GetSnapLen ();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
PcapFileObject::GetDataLinkType (void)
|
||||
{
|
||||
return file.GetDataLinkType ();
|
||||
return m_file.GetDataLinkType ();
|
||||
}
|
||||
|
||||
} //namespace ns3
|
||||
|
||||
@@ -48,6 +48,7 @@ public:
|
||||
int32_t tzCorrection = PcapFile::ZONE_DEFAULT);
|
||||
|
||||
bool Write (Time t, Ptr<const Packet> p);
|
||||
bool Write (Time t, Header &header, Ptr<const Packet> p);
|
||||
bool Write (Time t, uint8_t const *buffer, uint32_t length);
|
||||
|
||||
uint32_t GetMagic (void);
|
||||
@@ -59,7 +60,7 @@ public:
|
||||
uint32_t GetDataLinkType (void);
|
||||
|
||||
private:
|
||||
PcapFile file;
|
||||
PcapFile m_file;
|
||||
};
|
||||
|
||||
} //namespace ns3
|
||||
|
||||
@@ -21,22 +21,41 @@
|
||||
#include "ns3/node-module.h"
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/pcap-writer.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("PerfPcap");
|
||||
|
||||
bool g_addheader = false;
|
||||
RadiotapHeader g_header;
|
||||
bool g_passheader = true;
|
||||
bool g_addheader = true;
|
||||
Time g_t(0.);
|
||||
|
||||
static void
|
||||
WritePacket (Ptr<PcapFileObject> file, Ptr<const Packet> packet)
|
||||
{
|
||||
if (g_passheader)
|
||||
{
|
||||
RadiotapHeader header;
|
||||
header.SetTsft (0);
|
||||
header.SetFrameFlags (RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE);
|
||||
header.SetRate (0);
|
||||
header.SetChannelFrequencyAndFlags (0, 0);
|
||||
|
||||
file->Write (g_t, header, packet);
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_addheader)
|
||||
{
|
||||
RadiotapHeader header;
|
||||
header.SetTsft (0);
|
||||
header.SetFrameFlags (RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE);
|
||||
header.SetRate (0);
|
||||
header.SetChannelFrequencyAndFlags (0, 0);
|
||||
|
||||
Ptr<Packet> p = packet->Copy ();
|
||||
p->AddHeader (g_header);
|
||||
p->AddHeader (header);
|
||||
file->Write (g_t, p);
|
||||
}
|
||||
else
|
||||
@@ -48,27 +67,70 @@ WritePacket (Ptr<PcapFileObject> file, Ptr<const Packet> packet)
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
uint32_t n = 100000;
|
||||
bool oldstyle = false;
|
||||
|
||||
CommandLine cmd;
|
||||
cmd.AddValue ("addheader", "Add a header to the traces to trigger a deep copy", g_addheader);
|
||||
cmd.AddValue ("passheader", "Pass header as reference instead of adding it", g_passheader);
|
||||
cmd.AddValue ("n", "How many packets to write (defaults to 100000", n);
|
||||
cmd.AddValue ("oldstyle", "run the old style pcap writer stuff if true", oldstyle);
|
||||
cmd.Parse (argc, argv);
|
||||
|
||||
PcapHelper pcapHelper;
|
||||
Ptr<PcapFileObject> file = pcapHelper.CreateFile ("perf-pcap.pcap", "w", 9999);
|
||||
uint64_t et;
|
||||
|
||||
Ptr<Packet> p = Create<Packet> (1024);
|
||||
|
||||
NS_LOG_UNCOND ("timing pcap file write of 1K packet");
|
||||
NS_LOG_UNCOND ("g_addheader = " << g_addheader);
|
||||
|
||||
SystemWallClockMs ms;
|
||||
ms.Start ();
|
||||
|
||||
for (uint32_t i = 0; i < 100000; ++i)
|
||||
if (oldstyle)
|
||||
{
|
||||
WritePacket (file, p);
|
||||
PcapWriter pcapWriter;
|
||||
pcapWriter.Open ("perf-pcap.pcap");
|
||||
pcapWriter.WriteWifiRadiotapHeader ();
|
||||
|
||||
Ptr<Packet> p = Create<Packet> (1024);
|
||||
|
||||
// NS_LOG_UNCOND ("timing old style pcap file write of 1K packet");
|
||||
// NS_LOG_UNCOND ("g_addheader = " << g_addheader);
|
||||
// NS_LOG_UNCOND ("g_passheader = " << g_passheader);
|
||||
// NS_LOG_UNCOND ("n = " << n);
|
||||
|
||||
SystemWallClockMs ms;
|
||||
ms.Start ();
|
||||
|
||||
for (uint32_t i = 0; i < n; ++i)
|
||||
{
|
||||
if (g_addheader)
|
||||
{
|
||||
pcapWriter.WriteWifiMonitorPacket (p, 0, 0, 0, true, false, 0., 0.);
|
||||
}
|
||||
else
|
||||
{
|
||||
pcapWriter.WritePacket (p);
|
||||
}
|
||||
}
|
||||
|
||||
et = ms.End ();
|
||||
}
|
||||
else
|
||||
{
|
||||
PcapHelper pcapHelper;
|
||||
Ptr<PcapFileObject> file = pcapHelper.CreateFile ("perf-pcap.pcap", "w", PcapHelper::DLT_IEEE802_11_RADIO);
|
||||
|
||||
Ptr<Packet> p = Create<Packet> (1024);
|
||||
|
||||
NS_LOG_UNCOND ("timing new style pcap file write of 1K packet");
|
||||
NS_LOG_UNCOND ("g_addheader = " << g_addheader);
|
||||
NS_LOG_UNCOND ("g_passheader = " << g_passheader);
|
||||
NS_LOG_UNCOND ("n = " << n);
|
||||
|
||||
SystemWallClockMs ms;
|
||||
ms.Start ();
|
||||
|
||||
for (uint32_t i = 0; i < n; ++i)
|
||||
{
|
||||
WritePacket (file, p);
|
||||
}
|
||||
|
||||
et = ms.End ();
|
||||
}
|
||||
|
||||
uint64_t et = ms.End ();
|
||||
|
||||
NS_LOG_UNCOND ("elapsed time = " << et);
|
||||
// NS_LOG_UNCOND ("elapsed time = " << et);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user