diff --git a/src/common/pcap-file-object.cc b/src/common/pcap-file-object.cc index 170d318d3..c445fbbd4 100644 --- a/src/common/pcap-file-object.cc +++ b/src/common/pcap-file-object.cc @@ -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 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 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 diff --git a/src/common/pcap-file-object.h b/src/common/pcap-file-object.h index a404db524..f35448a5f 100644 --- a/src/common/pcap-file-object.h +++ b/src/common/pcap-file-object.h @@ -48,6 +48,7 @@ public: int32_t tzCorrection = PcapFile::ZONE_DEFAULT); bool Write (Time t, Ptr p); + bool Write (Time t, Header &header, Ptr 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 diff --git a/src/test/perf/perf-pcap.cc b/src/test/perf/perf-pcap.cc index aaef727a5..c6e0ffa32 100644 --- a/src/test/perf/perf-pcap.cc +++ b/src/test/perf/perf-pcap.cc @@ -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 file, Ptr 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 p = packet->Copy (); - p->AddHeader (g_header); + p->AddHeader (header); file->Write (g_t, p); } else @@ -48,27 +67,70 @@ WritePacket (Ptr file, Ptr 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 file = pcapHelper.CreateFile ("perf-pcap.pcap", "w", 9999); + uint64_t et; - Ptr p = Create (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 p = Create (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 file = pcapHelper.CreateFile ("perf-pcap.pcap", "w", PcapHelper::DLT_IEEE802_11_RADIO); + + Ptr p = Create (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); }