--- a/src/common/pcap-writer.cc Thu Aug 13 09:36:16 2009 +0200
+++ b/src/common/pcap-writer.cc Thu Aug 13 09:36:53 2009 +0200
@@ -29,6 +29,7 @@
#include "ns3/assert.h"
#include "ns3/abort.h"
#include "ns3/simulator.h"
+#include "ns3/uinteger.h"
#include "pcap-writer.h"
#include "packet.h"
@@ -36,6 +37,8 @@
namespace ns3 {
+NS_OBJECT_ENSURE_REGISTERED (PcapWriter);
+
enum {
PCAP_ETHERNET = 1,
PCAP_PPP = 9,
@@ -45,6 +48,21 @@
PCAP_80211_RADIOTAP = 127,
};
+TypeId
+PcapWriter::GetTypeId (void)
+{
+ static TypeId tid = TypeId ("ns3::PcapWriter")
+ .SetParent<Object> ()
+ .AddConstructor<PcapWriter> ()
+ .AddAttribute ("CaptureSize",
+ "Number of bytes to capture at the start of each packet written in the pcap file. Zero means capture all bytes.",
+ UintegerValue (0),
+ MakeUintegerAccessor (&PcapWriter::m_captureSize),
+ MakeUintegerChecker<uint32_t> ())
+ ;
+ return tid;
+}
+
PcapWriter::PcapWriter ()
{
NS_LOG_FUNCTION (this);
@@ -162,9 +180,18 @@
uint64_t us = current % 1000000;
Write32 (s & 0xffffffff);
Write32 (us & 0xffffffff);
- Write32 (packet->GetSize ());
- Write32 (packet->GetSize ());
- packet->CopyData (m_writer, packet->GetSize ());
+ uint32_t thisCaptureSize;
+ if (m_captureSize == 0)
+ {
+ thisCaptureSize = packet->GetSize ();
+ }
+ else
+ {
+ thisCaptureSize = std::min (m_captureSize, packet->GetSize ());
+ }
+ Write32 (thisCaptureSize);
+ Write32 (packet->GetSize ()); // actual packet size
+ packet->CopyData (m_writer, thisCaptureSize);
}
}
@@ -203,7 +230,10 @@
// real devices (e.g. madwifi) handle this case, especially for TX
// packets (radiotap specs says TSFT is not used for TX packets,
// but madwifi actually uses it).
- uint64_t tsft = current;
+ uint64_t tsft = current;
+
+
+ uint32_t wifiMonitorHeaderSize;
if (m_pcapMode == PCAP_80211_PRISM)
{
@@ -226,10 +256,17 @@
#define PRISM_ITEM_LENGTH 4
-
- uint32_t size = packet->GetSize () + PRISM_MSG_LENGTH;
- Write32 (size); // total packet size
- Write32 (size); // captured size
+ wifiMonitorHeaderSize = PRISM_MSG_LENGTH;
+ if (m_captureSize == 0)
+ {
+ Write32 (packet->GetSize () + wifiMonitorHeaderSize); // captured size == actual packet size
+ }
+ else
+ {
+ uint32_t thisCaptureSize = std::min (m_captureSize, packet->GetSize () + wifiMonitorHeaderSize);
+ Write32 (thisCaptureSize);
+ }
+ Write32 (packet->GetSize () + wifiMonitorHeaderSize); // actual packet size
Write32(PRISM_MSG_CODE);
Write32(PRISM_MSG_LENGTH);
@@ -349,18 +386,26 @@
#define RADIOTAP_TX_PRESENT (RADIOTAP_TSFT | RADIOTAP_FLAGS | RADIOTAP_RATE | RADIOTAP_CHANNEL)
#define RADIOTAP_TX_LENGTH (8+8+1+1+2+2)
-
- uint32_t size;
+
if (isTx)
{
- size = packet->GetSize () + RADIOTAP_TX_LENGTH;
+ wifiMonitorHeaderSize = RADIOTAP_TX_LENGTH;
}
else
{
- size = packet->GetSize () + RADIOTAP_RX_LENGTH;
+ wifiMonitorHeaderSize = RADIOTAP_RX_LENGTH;
+ }
+
+ if (m_captureSize == 0)
+ {
+ Write32 (packet->GetSize () + wifiMonitorHeaderSize); // captured size == actual packet size
}
- Write32 (size); // total packet size
- Write32 (size); // captured size
+ else
+ {
+ uint32_t thisCaptureSize = std::min (m_captureSize, packet->GetSize () + wifiMonitorHeaderSize);
+ Write32 (thisCaptureSize);
+ }
+ Write32 (packet->GetSize () + wifiMonitorHeaderSize); // actual packet size
Write8(0); // radiotap version
Write8(0); // padding
@@ -412,11 +457,23 @@
}
// finally, write rest of packet
- packet->CopyData (m_writer, packet->GetSize ());
+ if (m_captureSize == 0)
+ {
+ packet->CopyData (m_writer, packet->GetSize ());
+ }
+ else
+ {
+ packet->CopyData (m_writer, m_captureSize - wifiMonitorHeaderSize);
+ }
+
}
-
+void
+PcapWriter::SetCaptureSize (uint32_t size)
+{
+ m_captureSize = size;
+}
int8_t
PcapWriter::RoundToInt8 (double value)
--- a/src/common/pcap-writer.h Thu Aug 13 09:36:16 2009 +0200
+++ b/src/common/pcap-writer.h Thu Aug 13 09:36:53 2009 +0200
@@ -22,7 +22,7 @@
#define PCAP_WRITER_H
#include <stdint.h>
-#include "ns3/ref-count-base.h"
+#include "ns3/object.h"
namespace ns3 {
@@ -36,9 +36,10 @@
* Log Packets to a file in pcap format which can be
* read by pcap readers.
*/
-class PcapWriter : public RefCountBase
+class PcapWriter : public Object
{
public:
+ static TypeId GetTypeId (void);
PcapWriter ();
~PcapWriter ();
@@ -128,7 +129,13 @@
uint32_t rate, bool isShortPreamble, bool isTx,
double signalDbm, double noiseDbm);
-
+ /**
+ * Set the maximum number of bytes to be captured for each packet.
+ *
+ * @param size the maximum number of bytes to be captured. If zero
+ * (default), the whole packet will be captured.
+ */
+ void SetCaptureSize (uint32_t size);
private:
@@ -141,6 +148,8 @@
int8_t RoundToInt8 (double value);
std::ofstream *m_writer;
uint32_t m_pcapMode;
+ uint32_t m_captureSize;
+
};
} // namespace ns3
--- a/src/helper/csma-helper.cc Thu Aug 13 09:36:16 2009 +0200
+++ b/src/helper/csma-helper.cc Thu Aug 13 09:36:53 2009 +0200
@@ -76,7 +76,7 @@
}
oss.str ("");
oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
- Ptr<PcapWriter> pcap = Create<PcapWriter> ();
+ Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
pcap->Open (oss.str ());
pcap->WriteEthernetHeader ();
oss.str ("");
--- a/src/helper/emu-helper.cc Thu Aug 13 09:36:16 2009 +0200
+++ b/src/helper/emu-helper.cc Thu Aug 13 09:36:53 2009 +0200
@@ -70,7 +70,7 @@
NS_LOG_FUNCTION (filename << nodeid << deviceid << promiscuous);
std::ostringstream oss;
oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
- Ptr<PcapWriter> pcap = Create<PcapWriter> ();
+ Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
pcap->Open (oss.str ());
pcap->WriteEthernetHeader ();
--- a/src/helper/internet-stack-helper.cc Thu Aug 13 09:36:16 2009 +0200
+++ b/src/helper/internet-stack-helper.cc Thu Aug 13 09:36:53 2009 +0200
@@ -356,7 +356,7 @@
InternetStackHelper::Trace trace;
trace.nodeId = nodeId;
trace.interfaceId = interfaceId;
- trace.writer = Create<PcapWriter> ();
+ trace.writer = CreateObject<PcapWriter> ();
std::ostringstream oss;
oss << m_pcapBaseFilename << "-" << nodeId << "-" << interfaceId << ".pcap";
trace.writer->Open (oss.str ());
--- a/src/helper/point-to-point-helper.cc Thu Aug 13 09:36:16 2009 +0200
+++ b/src/helper/point-to-point-helper.cc Thu Aug 13 09:36:53 2009 +0200
@@ -75,7 +75,7 @@
}
oss.str ("");
oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
- Ptr<PcapWriter> pcap = Create<PcapWriter> ();
+ Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
pcap->Open (oss.str ());
pcap->WritePppHeader ();
oss.str ("");
--- a/src/helper/yans-wifi-helper.cc Thu Aug 13 09:36:16 2009 +0200
+++ b/src/helper/yans-wifi-helper.cc Thu Aug 13 09:36:53 2009 +0200
@@ -234,9 +234,7 @@
}
oss.str ("");
oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
- // we must fully-qualify the call to Create below because it conflicts
- // with the locally-defined WifiPhyHelper::Create method.
- Ptr<PcapWriter> pcap = ::ns3::Create<PcapWriter> ();
+ Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
pcap->Open (oss.str ());
switch (m_pcapFormat) {