bug 639: add configurable capture size to pcap
authorNicola Baldo <nbaldo@cttc.es>
Thu Aug 13 09:36:53 2009 +0200 (6 months ago)
changeset 4709b0743dbc4e55
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
     1.1 --- a/src/common/pcap-writer.cc	Thu Aug 13 09:36:16 2009 +0200
     1.2 +++ b/src/common/pcap-writer.cc	Thu Aug 13 09:36:53 2009 +0200
     1.3 @@ -29,6 +29,7 @@
     1.4  #include "ns3/assert.h"
     1.5  #include "ns3/abort.h"
     1.6  #include "ns3/simulator.h"
     1.7 +#include "ns3/uinteger.h"
     1.8  #include "pcap-writer.h"
     1.9  #include "packet.h"
    1.10  
    1.11 @@ -36,6 +37,8 @@
    1.12  
    1.13  namespace ns3 {
    1.14  
    1.15 +NS_OBJECT_ENSURE_REGISTERED (PcapWriter);
    1.16 +
    1.17  enum {
    1.18    PCAP_ETHERNET = 1,
    1.19    PCAP_PPP      = 9,
    1.20 @@ -45,6 +48,21 @@
    1.21    PCAP_80211_RADIOTAP  = 127,
    1.22  };
    1.23  
    1.24 +TypeId 
    1.25 +PcapWriter::GetTypeId (void)
    1.26 +{
    1.27 +  static TypeId tid = TypeId ("ns3::PcapWriter")
    1.28 +    .SetParent<Object> ()
    1.29 +    .AddConstructor<PcapWriter> ()
    1.30 +    .AddAttribute ("CaptureSize",
    1.31 +                   "Number of bytes to capture at the start of each packet written in the pcap file. Zero means capture all bytes.",
    1.32 +                   UintegerValue (0),
    1.33 +                   MakeUintegerAccessor (&PcapWriter::m_captureSize),
    1.34 +                   MakeUintegerChecker<uint32_t> ())
    1.35 +    ;
    1.36 +  return tid;
    1.37 +}
    1.38 +
    1.39  PcapWriter::PcapWriter ()
    1.40  {
    1.41    NS_LOG_FUNCTION (this);
    1.42 @@ -162,9 +180,18 @@
    1.43        uint64_t us = current % 1000000;
    1.44        Write32 (s & 0xffffffff);
    1.45        Write32 (us & 0xffffffff);
    1.46 -      Write32 (packet->GetSize ());
    1.47 -      Write32 (packet->GetSize ());
    1.48 -      packet->CopyData (m_writer, packet->GetSize ());
    1.49 +      uint32_t thisCaptureSize;
    1.50 +      if (m_captureSize == 0)
    1.51 +        {
    1.52 +          thisCaptureSize = packet->GetSize ();
    1.53 +        }
    1.54 +      else
    1.55 +        {
    1.56 +          thisCaptureSize = std::min (m_captureSize, packet->GetSize ());         
    1.57 +        }          
    1.58 +      Write32 (thisCaptureSize); 
    1.59 +      Write32 (packet->GetSize ()); // actual packet size
    1.60 +      packet->CopyData (m_writer, thisCaptureSize);
    1.61      }
    1.62  }
    1.63  
    1.64 @@ -203,7 +230,10 @@
    1.65    // real devices (e.g. madwifi) handle this case, especially for TX
    1.66    // packets (radiotap specs says TSFT is not used for TX packets,
    1.67    // but madwifi actually uses it).
    1.68 -  uint64_t tsft = current;      
    1.69 +  uint64_t tsft = current;    
    1.70 +
    1.71 +  
    1.72 +  uint32_t wifiMonitorHeaderSize;  
    1.73      
    1.74    if (m_pcapMode == PCAP_80211_PRISM)
    1.75      {
    1.76 @@ -226,10 +256,17 @@
    1.77  #define PRISM_ITEM_LENGTH       4
    1.78  
    1.79  
    1.80 -
    1.81 -      uint32_t size = packet->GetSize () + PRISM_MSG_LENGTH;
    1.82 -      Write32 (size); // total packet size
    1.83 -      Write32 (size); // captured size
    1.84 +      wifiMonitorHeaderSize = PRISM_MSG_LENGTH;
    1.85 +      if (m_captureSize == 0)
    1.86 +        {
    1.87 +          Write32 (packet->GetSize () + wifiMonitorHeaderSize); // captured size == actual packet size
    1.88 +        }
    1.89 +      else
    1.90 +        {
    1.91 +          uint32_t thisCaptureSize = std::min (m_captureSize, packet->GetSize () + wifiMonitorHeaderSize);         
    1.92 +          Write32 (thisCaptureSize); 
    1.93 +        }
    1.94 +      Write32 (packet->GetSize () + wifiMonitorHeaderSize); // actual packet size
    1.95  
    1.96        Write32(PRISM_MSG_CODE);
    1.97        Write32(PRISM_MSG_LENGTH);
    1.98 @@ -349,18 +386,26 @@
    1.99  
   1.100  #define RADIOTAP_TX_PRESENT (RADIOTAP_TSFT | RADIOTAP_FLAGS  | RADIOTAP_RATE | RADIOTAP_CHANNEL)
   1.101  #define RADIOTAP_TX_LENGTH (8+8+1+1+2+2)
   1.102 -
   1.103 -      uint32_t size;
   1.104 +      
   1.105        if (isTx)
   1.106          {
   1.107 -          size = packet->GetSize () + RADIOTAP_TX_LENGTH;
   1.108 +          wifiMonitorHeaderSize = RADIOTAP_TX_LENGTH;
   1.109          }
   1.110        else
   1.111          {
   1.112 -          size = packet->GetSize () + RADIOTAP_RX_LENGTH;
   1.113 +          wifiMonitorHeaderSize = RADIOTAP_RX_LENGTH;
   1.114 +        }      
   1.115 +
   1.116 +      if (m_captureSize == 0)
   1.117 +        {
   1.118 +          Write32 (packet->GetSize () + wifiMonitorHeaderSize); // captured size == actual packet size
   1.119          }
   1.120 -      Write32 (size); // total packet size
   1.121 -      Write32 (size); // captured size
   1.122 +      else
   1.123 +        {
   1.124 +          uint32_t thisCaptureSize = std::min (m_captureSize, packet->GetSize () + wifiMonitorHeaderSize);         
   1.125 +          Write32 (thisCaptureSize); 
   1.126 +        }
   1.127 +      Write32 (packet->GetSize () + wifiMonitorHeaderSize); // actual packet size
   1.128  
   1.129        Write8(0); // radiotap version
   1.130        Write8(0); // padding
   1.131 @@ -412,11 +457,23 @@
   1.132      }    
   1.133  
   1.134    // finally, write rest of packet
   1.135 -  packet->CopyData (m_writer, packet->GetSize ());
   1.136 +  if (m_captureSize == 0)
   1.137 +    {
   1.138 +      packet->CopyData (m_writer, packet->GetSize ());
   1.139 +    }
   1.140 +  else
   1.141 +    {
   1.142 +      packet->CopyData (m_writer, m_captureSize - wifiMonitorHeaderSize);      
   1.143 +    }
   1.144 +
   1.145  }
   1.146      
   1.147    
   1.148 -
   1.149 +void 
   1.150 +PcapWriter::SetCaptureSize (uint32_t size)
   1.151 +{
   1.152 +  m_captureSize = size;
   1.153 +}
   1.154  
   1.155  int8_t 
   1.156  PcapWriter::RoundToInt8 (double value)
     2.1 --- a/src/common/pcap-writer.h	Thu Aug 13 09:36:16 2009 +0200
     2.2 +++ b/src/common/pcap-writer.h	Thu Aug 13 09:36:53 2009 +0200
     2.3 @@ -22,7 +22,7 @@
     2.4  #define PCAP_WRITER_H
     2.5  
     2.6  #include <stdint.h>
     2.7 -#include "ns3/ref-count-base.h"
     2.8 +#include "ns3/object.h"
     2.9  
    2.10  namespace ns3 {
    2.11  
    2.12 @@ -36,9 +36,10 @@
    2.13   * Log Packets to a file in pcap format which can be
    2.14   * read by pcap readers.
    2.15   */
    2.16 -class PcapWriter : public RefCountBase
    2.17 +class PcapWriter : public Object
    2.18  {
    2.19  public:
    2.20 +  static TypeId GetTypeId (void);
    2.21    PcapWriter ();
    2.22    ~PcapWriter ();
    2.23  
    2.24 @@ -128,7 +129,13 @@
    2.25                                uint32_t rate, bool isShortPreamble, bool isTx, 
    2.26                                double signalDbm, double noiseDbm);
    2.27  
    2.28 -
    2.29 +  /** 
    2.30 +   * Set the maximum number of bytes to be captured for each packet. 
    2.31 +   * 
    2.32 +   * @param size the maximum number of bytes to be captured. If zero
    2.33 +   * (default), the whole packet will be captured. 
    2.34 +   */
    2.35 +  void SetCaptureSize (uint32_t size);
    2.36  
    2.37  
    2.38  private:
    2.39 @@ -141,6 +148,8 @@
    2.40    int8_t RoundToInt8 (double value);
    2.41    std::ofstream *m_writer;
    2.42    uint32_t m_pcapMode;
    2.43 +  uint32_t m_captureSize;
    2.44 +  
    2.45  };
    2.46  
    2.47  } // namespace ns3
     3.1 --- a/src/helper/csma-helper.cc	Thu Aug 13 09:36:16 2009 +0200
     3.2 +++ b/src/helper/csma-helper.cc	Thu Aug 13 09:36:53 2009 +0200
     3.3 @@ -76,7 +76,7 @@
     3.4      }
     3.5    oss.str ("");
     3.6    oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
     3.7 -  Ptr<PcapWriter> pcap = Create<PcapWriter> ();
     3.8 +  Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
     3.9    pcap->Open (oss.str ());
    3.10    pcap->WriteEthernetHeader ();
    3.11    oss.str ("");
     4.1 --- a/src/helper/emu-helper.cc	Thu Aug 13 09:36:16 2009 +0200
     4.2 +++ b/src/helper/emu-helper.cc	Thu Aug 13 09:36:53 2009 +0200
     4.3 @@ -70,7 +70,7 @@
     4.4    NS_LOG_FUNCTION (filename << nodeid << deviceid << promiscuous);
     4.5    std::ostringstream oss;
     4.6    oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
     4.7 -  Ptr<PcapWriter> pcap = Create<PcapWriter> ();
     4.8 +  Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
     4.9    pcap->Open (oss.str ());
    4.10    pcap->WriteEthernetHeader ();
    4.11  
     5.1 --- a/src/helper/internet-stack-helper.cc	Thu Aug 13 09:36:16 2009 +0200
     5.2 +++ b/src/helper/internet-stack-helper.cc	Thu Aug 13 09:36:53 2009 +0200
     5.3 @@ -356,7 +356,7 @@
     5.4    InternetStackHelper::Trace trace;
     5.5    trace.nodeId = nodeId;
     5.6    trace.interfaceId = interfaceId;
     5.7 -  trace.writer = Create<PcapWriter> ();
     5.8 +  trace.writer = CreateObject<PcapWriter> ();
     5.9    std::ostringstream oss;
    5.10    oss << m_pcapBaseFilename << "-" << nodeId << "-" << interfaceId << ".pcap";
    5.11    trace.writer->Open (oss.str ());
     6.1 --- a/src/helper/point-to-point-helper.cc	Thu Aug 13 09:36:16 2009 +0200
     6.2 +++ b/src/helper/point-to-point-helper.cc	Thu Aug 13 09:36:53 2009 +0200
     6.3 @@ -75,7 +75,7 @@
     6.4      }
     6.5    oss.str ("");
     6.6    oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
     6.7 -  Ptr<PcapWriter> pcap = Create<PcapWriter> ();
     6.8 +  Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
     6.9    pcap->Open (oss.str ());
    6.10    pcap->WritePppHeader ();
    6.11    oss.str ("");
     7.1 --- a/src/helper/yans-wifi-helper.cc	Thu Aug 13 09:36:16 2009 +0200
     7.2 +++ b/src/helper/yans-wifi-helper.cc	Thu Aug 13 09:36:53 2009 +0200
     7.3 @@ -234,9 +234,7 @@
     7.4      }
     7.5    oss.str ("");
     7.6    oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
     7.7 -  // we must fully-qualify the call to Create below because it conflicts
     7.8 -  // with the locally-defined WifiPhyHelper::Create method.
     7.9 -  Ptr<PcapWriter> pcap = ::ns3::Create<PcapWriter> ();
    7.10 +  Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
    7.11    pcap->Open (oss.str ());
    7.12  
    7.13    switch (m_pcapFormat) {