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) {