bug 639: add configurable capture size to pcap
authorNicola Baldo <nbaldo@cttc.es>
Thu, 13 Aug 2009 09:36:53 +0200
changeset 4709 b0743dbc4e55
parent 4708 b251fb79becb
child 4710 e56da5fd6697
bug 639: add configurable capture size to pcap
src/common/pcap-writer.cc
src/common/pcap-writer.h
src/helper/csma-helper.cc
src/helper/emu-helper.cc
src/helper/internet-stack-helper.cc
src/helper/point-to-point-helper.cc
src/helper/yans-wifi-helper.cc
--- 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) {