add ability to pass a header to pcap file object

This commit is contained in:
Craig Dowell
2010-01-29 20:08:50 -08:00
parent b2a9926bdf
commit 63d879dd0b
3 changed files with 123 additions and 32 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}