22 #include "ns3/assert.h"
23 #include "ns3/abort.h"
24 #include "ns3/simulator.h"
25 #include "ns3/nstime.h"
26 #include "ns3/config.h"
27 #include "athstats-helper.h"
38 AthstatsHelper::AthstatsHelper ()
44 AthstatsHelper::EnableAthstats (std::string filename, uint32_t nodeid, uint32_t deviceid)
46 Ptr<AthstatsWifiTraceSink> athstats = CreateObject<AthstatsWifiTraceSink> ();
47 std::ostringstream oss;
49 <<
"_" << std::setfill (
'0') << std::setw (3) << std::right << nodeid
50 <<
"_" << std::setfill (
'0') << std::setw (3) << std::right << deviceid;
51 athstats->Open (oss.str ());
54 oss <<
"/NodeList/" << nodeid <<
"/DeviceList/" << deviceid;
55 std::string devicepath = oss.str ();
57 Config::Connect (devicepath +
"/Mac/MacTx",
MakeCallback (&AthstatsWifiTraceSink::DevTxTrace, athstats));
58 Config::Connect (devicepath +
"/Mac/MacRx",
MakeCallback (&AthstatsWifiTraceSink::DevRxTrace, athstats));
60 Config::Connect (devicepath +
"/RemoteStationManager/TxRtsFailed",
MakeCallback (&AthstatsWifiTraceSink::TxRtsFailedTrace, athstats));
61 Config::Connect (devicepath +
"/RemoteStationManager/MacTxDataFailed",
MakeCallback (&AthstatsWifiTraceSink::TxDataFailedTrace, athstats));
62 Config::Connect (devicepath +
"/RemoteStationManager/MacTxFinalRtsFailed",
MakeCallback (&AthstatsWifiTraceSink::TxFinalRtsFailedTrace, athstats));
63 Config::Connect (devicepath +
"/RemoteStationManager/MacTxFinalDataFailed",
MakeCallback (&AthstatsWifiTraceSink::TxFinalDataFailedTrace, athstats));
65 Config::Connect (devicepath +
"/Phy/State/RxOk",
MakeCallback (&AthstatsWifiTraceSink::PhyRxOkTrace, athstats));
66 Config::Connect (devicepath +
"/Phy/State/RxError",
MakeCallback (&AthstatsWifiTraceSink::PhyRxErrorTrace, athstats));
67 Config::Connect (devicepath +
"/Phy/State/Tx",
MakeCallback (&AthstatsWifiTraceSink::PhyTxTrace, athstats));
68 Config::Connect (devicepath +
"/Phy/State/State",
MakeCallback (&AthstatsWifiTraceSink::PhyStateTrace, athstats));
72 AthstatsHelper::EnableAthstats (std::string filename, Ptr<NetDevice> nd)
74 EnableAthstats (filename, nd->GetNode ()->GetId (), nd->GetIfIndex ());
79 AthstatsHelper::EnableAthstats (std::string filename, NetDeviceContainer d)
81 for (NetDeviceContainer::Iterator i = d.Begin (); i != d.End (); ++i)
83 Ptr<NetDevice> dev = *i;
84 EnableAthstats (filename, dev->GetNode ()->GetId (), dev->GetIfIndex ());
90 AthstatsHelper::EnableAthstats (std::string filename, NodeContainer n)
92 NetDeviceContainer devs;
93 for (NodeContainer::Iterator i = n.Begin (); i != n.End (); ++i)
96 for (uint32_t j = 0; j < node->GetNDevices (); ++j)
98 devs.Add (node->GetDevice (j));
101 EnableAthstats (filename, devs);
108 NS_OBJECT_ENSURE_REGISTERED (AthstatsWifiTraceSink);
111 AthstatsWifiTraceSink::GetTypeId (
void)
113 static TypeId tid = TypeId (
"ns3::AthstatsWifiTraceSink")
114 .SetParent<Object> ()
115 .AddConstructor<AthstatsWifiTraceSink> ()
116 .AddAttribute (
"Interval",
117 "Time interval between reports",
118 TimeValue (Seconds (1.0)),
119 MakeTimeAccessor (&AthstatsWifiTraceSink::m_interval),
125 AthstatsWifiTraceSink::AthstatsWifiTraceSink ()
128 m_shortRetryCount (0),
129 m_longRetryCount (0),
130 m_exceededRetryCount (0),
132 m_phyRxErrorCount (0),
136 Simulator::ScheduleNow (&AthstatsWifiTraceSink::WriteStats,
this);
139 AthstatsWifiTraceSink::~AthstatsWifiTraceSink ()
146 if (m_writer->is_open ())
165 AthstatsWifiTraceSink::ResetCounters ()
169 m_shortRetryCount = 0;
170 m_longRetryCount = 0;
171 m_exceededRetryCount = 0;
173 m_phyRxErrorCount = 0;
193 AthstatsWifiTraceSink::TxRtsFailedTrace (std::string context,
Mac48Address address)
200 AthstatsWifiTraceSink::TxDataFailedTrace (std::string context,
Mac48Address address)
207 AthstatsWifiTraceSink::TxFinalRtsFailedTrace (std::string context,
Mac48Address address)
210 ++m_exceededRetryCount;
214 AthstatsWifiTraceSink::TxFinalDataFailedTrace (std::string context,
Mac48Address address)
217 ++m_exceededRetryCount;
225 NS_LOG_FUNCTION (
this << context << packet <<
" mode=" << mode <<
" snr=" << snr );
230 AthstatsWifiTraceSink::PhyRxErrorTrace (std::string context,
Ptr<const Packet> packet,
double snr)
254 AthstatsWifiTraceSink::Open (std::string
const &name)
257 NS_ABORT_MSG_UNLESS (m_writer == 0,
"AthstatsWifiTraceSink::Open (): m_writer already allocated (std::ofstream leak detected)");
259 m_writer =
new std::ofstream ();
260 NS_ABORT_MSG_UNLESS (m_writer,
"AthstatsWifiTraceSink::Open (): Cannot allocate m_writer");
264 m_writer->open (name.c_str (), std::ios_base::binary | std::ios_base::out);
265 NS_ABORT_MSG_IF (m_writer->fail (),
"AthstatsWifiTraceSink::Open (): m_writer->open (" << name.c_str () <<
") failed");
267 NS_ASSERT_MSG (m_writer->is_open (),
"AthstatsWifiTraceSink::Open (): m_writer not open");
274 AthstatsWifiTraceSink::WriteStats ()
280 snprintf (str, 200,
"%8u %8u %7u %7u %7u %6u %6u %6u %7u %4u %3uM\n",
281 (
unsigned int) m_txCount,
282 (
unsigned int) m_rxCount,
284 (
unsigned int) m_shortRetryCount,
285 (
unsigned int) m_longRetryCount,
286 (
unsigned int) m_exceededRetryCount,
287 (
unsigned int) m_phyRxErrorCount,
300 Simulator::Schedule (m_interval, &AthstatsWifiTraceSink::WriteStats,
this);
#define NS_LOG_FUNCTION(parameters)
#define NS_LOG_COMPONENT_DEFINE(name)
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if cond is false.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
#define NS_LOG_LOGIC(msg)
#define NS_ASSERT_MSG(condition, message)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if cond is true.