--- a/samples/main-ap-wifi.cc Wed Oct 31 12:05:25 2007 +0100
+++ b/samples/main-ap-wifi.cc Wed Oct 31 12:27:20 2007 +0100
@@ -20,6 +20,8 @@
#include "ns3/wifi-net-device.h"
#include "ns3/wifi-channel.h"
+#include "ns3/wifi-phy.h"
+
#include "ns3/simulator.h"
#include "ns3/callback.h"
#include "ns3/ptr.h"
@@ -44,6 +46,26 @@
{
std::cout << context << " ad=" << address << " p: " << p << std::endl;
}
+static void
+WifiPhyStateTrace (const TraceContext &context, Time start, Time duration, enum WifiPhy::State state)
+{
+ std::cout << context << " state=";
+ switch (state) {
+ case WifiPhy::TX:
+ std::cout << "tx ";
+ break;
+ case WifiPhy::SYNC:
+ std::cout << "sync ";
+ break;
+ case WifiPhy::CCA_BUSY:
+ std::cout << "cca-busy";
+ break;
+ case WifiPhy::IDLE:
+ std::cout << "idle ";
+ break;
+ }
+ std::cout << " start="<<start<<" duration="<<duration<<std::endl;
+}
static Ptr<Node>
CreateApNode (Ptr<WifiChannel> channel,
@@ -165,6 +187,7 @@
GlobalRouteManager::PopulateRoutingTables ();
NodeList::Connect ("/nodes/*/devices/*/*", MakeCallback (&WifiNetDeviceTrace));
+ NodeList::Connect ("/nodes/*/devices/*/phy/state", MakeCallback (&WifiPhyStateTrace));
Simulator::Run ();
--- a/src/devices/wifi/wifi-net-device.cc Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wifi-net-device.cc Wed Oct 31 12:27:20 2007 +0100
@@ -221,6 +221,7 @@
"Mac48Address", "the destination of the packet"),
m_txLogger,
WifiNetDeviceTraceType (WifiNetDeviceTraceType::TX));
+ resolver->AddComposite ("phy", m_phy);
resolver->SetParentResolver (NetDevice::GetTraceResolver ());
return resolver;
}
--- a/src/devices/wifi/wifi-phy.cc Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wifi-phy.cc Wed Oct 31 12:27:20 2007 +0100
@@ -29,6 +29,7 @@
#include "ns3/random-variable.h"
#include "ns3/assert.h"
#include "ns3/log.h"
+#include "ns3/composite-trace-resolver.h"
#include <math.h>
NS_LOG_COMPONENT_DEFINE ("WifiPhy");
@@ -203,6 +204,20 @@
m_modes.clear ();
}
+Ptr<TraceResolver>
+WifiPhy::GetTraceResolver (void) const
+{
+ Ptr<CompositeTraceResolver> resolver =
+ Create<CompositeTraceResolver> ();
+ resolver->AddSource ("state",
+ TraceDoc ("The WifiPhy state",
+ "Time", "start time",
+ "Time", "duration",
+ "enum WifiPhy::State", "the state of the PHY layer."),
+ m_stateLogger);
+ resolver->SetParentResolver (Object::GetTraceResolver ());
+ return resolver;
+}
void
@@ -494,7 +509,7 @@
}
char const *
-WifiPhy::StateToString (enum WifiPhyState state)
+WifiPhy::StateToString (enum State state)
{
switch (state) {
case TX:
@@ -514,7 +529,7 @@
break;
}
}
-enum WifiPhy::WifiPhyState
+enum WifiPhy::State
WifiPhy::GetState (void)
{
if (m_endTx > Simulator::Now ())
@@ -617,9 +632,9 @@
m_endCcaBusy > m_endTx) {
Time ccaBusyStart = Max (m_endTx, m_endSync);
ccaBusyStart = Max (ccaBusyStart, m_startCcaBusy);
- m_stateLogger (ccaBusyStart, idleStart - ccaBusyStart, 2);
+ m_stateLogger (ccaBusyStart, idleStart - ccaBusyStart, WifiPhy::CCA_BUSY);
}
- m_stateLogger (idleStart, now - idleStart, 3);
+ m_stateLogger (idleStart, now - idleStart, WifiPhy::IDLE);
}
void
@@ -632,12 +647,12 @@
* as its endSync event are cancelled by the caller.
*/
m_syncing = false;
- m_stateLogger (m_startSync, now - m_startSync, 1);
+ m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
break;
case WifiPhy::CCA_BUSY: {
Time ccaStart = Max (m_endSync, m_endTx);
ccaStart = Max (ccaStart, m_startCcaBusy);
- m_stateLogger (ccaStart, now - ccaStart, 2);
+ m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
} break;
case WifiPhy::IDLE:
LogPreviousIdleAndCcaBusyStates ();
@@ -646,7 +661,7 @@
NS_ASSERT (false);
break;
}
- m_stateLogger (now, txDuration, 0);
+ m_stateLogger (now, txDuration, WifiPhy::TX);
m_previousStateChangeTime = now;
m_endTx = now + txDuration;
m_startTx = now;
@@ -664,7 +679,7 @@
case WifiPhy::CCA_BUSY: {
Time ccaStart = Max (m_endSync, m_endTx);
ccaStart = Max (ccaStart, m_startCcaBusy);
- m_stateLogger (ccaStart, now - ccaStart, 2);
+ m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
} break;
case WifiPhy::SYNC:
case WifiPhy::TX:
@@ -684,7 +699,7 @@
NS_ASSERT (m_syncing);
Time now = Simulator::Now ();
- m_stateLogger (m_startSync, now - m_startSync, 1);
+ m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
m_previousStateChangeTime = now;
m_syncing = false;
--- a/src/devices/wifi/wifi-phy.h Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wifi-phy.h Wed Oct 31 12:27:20 2007 +0100
@@ -72,6 +72,12 @@
class WifiPhy : public Object
{
public:
+ enum State {
+ SYNC,
+ TX,
+ CCA_BUSY,
+ IDLE
+ };
typedef Callback<void,Packet, double, WifiMode, enum WifiPreamble> SyncOkCallback;
typedef Callback<void,Packet, double> SyncErrorCallback;
@@ -105,12 +111,6 @@
double CalculateSnr (WifiMode txMode, double ber) const;
private:
- enum WifiPhyState {
- SYNC,
- TX,
- CCA_BUSY,
- IDLE
- };
class NiChange {
public:
NiChange (Time time, double delta);
@@ -126,10 +126,12 @@
typedef std::list<Ptr<RxEvent> > Events;
typedef std::vector <NiChange> NiChanges;
-private:
+private:
+ // inherited from ns3::Object.
+ virtual Ptr<TraceResolver> GetTraceResolver (void) const;
void Configure80211a (void);
- char const *StateToString (enum WifiPhyState state);
- enum WifiPhyState GetState (void);
+ char const *StateToString (enum State state);
+ enum WifiPhy::State GetState (void);
double GetEdThresholdW (void) const;
double DbmToW (double dbm) const;
double DbToRatio (double db) const;
@@ -236,12 +238,7 @@
* Invoked whenever we send the first bit of a signal.
*/
CallbackTraceSource<Time, uint32_t, double> m_startTxLogger;
- /* 80211-phy-state
- * param1: Start
- * param2: Duration
- * param3: state: 0 -> TX, 1 -> SYNC, 2 -> CCA, 3 -> IDLE
- */
- CallbackTraceSource<Time,Time,uint8_t> m_stateLogger;
+ CallbackTraceSource<Time,Time,enum WifiPhy::State> m_stateLogger;
};
} // namespace ns3
--- a/src/devices/wifi/wscript Wed Oct 31 12:05:25 2007 +0100
+++ b/src/devices/wifi/wscript Wed Oct 31 12:27:20 2007 +0100
@@ -41,4 +41,5 @@
'wifi-mode.h',
'ssid.h',
'wifi-preamble.h',
+ 'wifi-phy.h',
]