--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/wifi/wifi-phy-state-helper.cc Thu Jun 12 11:05:46 2008 -0700
@@ -0,0 +1,323 @@
+#include "wifi-phy-state-helper.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+
+NS_LOG_COMPONENT_DEFINE ("WifiPhyStateHelper");
+
+namespace ns3 {
+
+WifiPhyStateHelper::WifiPhyStateHelper ()
+ : m_syncing (false),
+ m_endTx (Seconds (0)),
+ m_endSync (Seconds (0)),
+ m_endCcaBusy (Seconds (0)),
+ m_startTx (Seconds (0)),
+ m_startSync (Seconds (0)),
+ m_startCcaBusy (Seconds (0)),
+ m_previousStateChangeTime (Seconds (0))
+{
+ NS_LOG_FUNCTION (this);
+}
+
+void
+WifiPhyStateHelper::SetReceiveOkCallback (WifiPhy::SyncOkCallback callback)
+{
+ m_syncOkCallback = callback;
+}
+void
+WifiPhyStateHelper::SetReceiveErrorCallback (WifiPhy::SyncErrorCallback callback)
+{
+ m_syncErrorCallback = callback;
+}
+void
+WifiPhyStateHelper::RegisterListener (WifiPhyListener *listener)
+{
+ m_listeners.push_back (listener);
+}
+
+bool
+WifiPhyStateHelper::IsStateCcaBusy (void)
+{
+ return GetState () == WifiPhy::CCA_BUSY;
+}
+
+bool
+WifiPhyStateHelper::IsStateIdle (void)
+{
+ return (GetState () == WifiPhy::IDLE)?true:false;
+}
+bool
+WifiPhyStateHelper::IsStateBusy (void)
+{
+ return (GetState () != WifiPhy::IDLE)?true:false;
+}
+bool
+WifiPhyStateHelper::IsStateSync (void)
+{
+ return (GetState () == WifiPhy::SYNC)?true:false;
+}
+bool
+WifiPhyStateHelper::IsStateTx (void)
+{
+ return (GetState () == WifiPhy::TX)?true:false;
+}
+
+
+
+Time
+WifiPhyStateHelper::GetStateDuration (void)
+{
+ return Simulator::Now () - m_previousStateChangeTime;
+}
+
+Time
+WifiPhyStateHelper::GetDelayUntilIdle (void)
+{
+ Time retval;
+
+ switch (GetState ()) {
+ case WifiPhy::SYNC:
+ retval = m_endSync - Simulator::Now ();
+ break;
+ case WifiPhy::TX:
+ retval = m_endTx - Simulator::Now ();
+ break;
+ case WifiPhy::CCA_BUSY:
+ retval = m_endCcaBusy - Simulator::Now ();
+ break;
+ case WifiPhy::IDLE:
+ retval = Seconds (0);
+ break;
+ default:
+ NS_ASSERT (false);
+ // NOTREACHED
+ retval = Seconds (0);
+ break;
+ }
+ retval = Max (retval, Seconds (0));
+ return retval;
+}
+
+Time
+WifiPhyStateHelper::GetLastRxStartTime (void) const
+{
+ return m_startSync;
+}
+
+char const *
+WifiPhyStateHelper::StateToString (enum WifiPhy::State state)
+{
+ switch (state) {
+ case WifiPhy::TX:
+ return "TX";
+ break;
+ case WifiPhy::CCA_BUSY:
+ return "CCA_BUSY";
+ break;
+ case WifiPhy::IDLE:
+ return "IDLE";
+ break;
+ case WifiPhy::SYNC:
+ return "SYNC";
+ break;
+ default:
+ NS_ASSERT (false);
+ // quiet compiler
+ return "INVALID";
+ break;
+ }
+}
+
+enum WifiPhy::State
+WifiPhyStateHelper::GetState (void)
+{
+ if (m_endTx > Simulator::Now ())
+ {
+ return WifiPhy::TX;
+ }
+ else if (m_syncing)
+ {
+ return WifiPhy::SYNC;
+ }
+ else if (m_endCcaBusy > Simulator::Now ())
+ {
+ return WifiPhy::CCA_BUSY;
+ }
+ else
+ {
+ return WifiPhy::IDLE;
+ }
+}
+
+
+void
+WifiPhyStateHelper::NotifyTxStart (Time duration)
+{
+ for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
+ (*i)->NotifyTxStart (duration);
+ }
+}
+void
+WifiPhyStateHelper::NotifySyncStart (Time duration)
+{
+ for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
+ (*i)->NotifyRxStart (duration);
+ }
+}
+void
+WifiPhyStateHelper::NotifySyncEndOk (void)
+{
+ for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
+ (*i)->NotifyRxEndOk ();
+ }
+}
+void
+WifiPhyStateHelper::NotifySyncEndError (void)
+{
+ for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
+ (*i)->NotifyRxEndError ();
+ }
+}
+void
+WifiPhyStateHelper::NotifyCcaBusyStart (Time duration)
+{
+ for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
+ (*i)->NotifyCcaBusyStart (duration);
+ }
+}
+
+void
+WifiPhyStateHelper::LogPreviousIdleAndCcaBusyStates (void)
+{
+ Time now = Simulator::Now ();
+ Time idleStart = Max (m_endCcaBusy, m_endSync);
+ idleStart = Max (idleStart, m_endTx);
+ NS_ASSERT (idleStart <= now);
+ if (m_endCcaBusy > m_endSync &&
+ m_endCcaBusy > m_endTx) {
+ Time ccaBusyStart = Max (m_endTx, m_endSync);
+ ccaBusyStart = Max (ccaBusyStart, m_startCcaBusy);
+ m_stateLogger (ccaBusyStart, idleStart - ccaBusyStart, WifiPhy::CCA_BUSY);
+ }
+ m_stateLogger (idleStart, now - idleStart, WifiPhy::IDLE);
+}
+
+void
+WifiPhyStateHelper::SwitchToTx (Time txDuration, Ptr<const Packet> packet, WifiMode txMode,
+ WifiPreamble preamble, uint8_t txPower)
+{
+ m_txTrace (packet, txMode, preamble, txPower);
+ NotifyTxStart (txDuration);
+ Time now = Simulator::Now ();
+ switch (GetState ()) {
+ case WifiPhy::SYNC:
+ /* The packet which is being received as well
+ * as its endSync event are cancelled by the caller.
+ */
+ m_syncing = false;
+ m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
+ m_endSync = now;
+ break;
+ case WifiPhy::CCA_BUSY: {
+ Time ccaStart = Max (m_endSync, m_endTx);
+ ccaStart = Max (ccaStart, m_startCcaBusy);
+ m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
+ } break;
+ case WifiPhy::IDLE:
+ LogPreviousIdleAndCcaBusyStates ();
+ break;
+ default:
+ NS_ASSERT (false);
+ break;
+ }
+ m_stateLogger (now, txDuration, WifiPhy::TX);
+ m_previousStateChangeTime = now;
+ m_endTx = now + txDuration;
+ m_startTx = now;
+}
+void
+WifiPhyStateHelper::SwitchToSync (Time rxDuration)
+{
+ NS_ASSERT (IsStateIdle () || IsStateCcaBusy ());
+ NS_ASSERT (!m_syncing);
+ NotifySyncStart (rxDuration);
+ Time now = Simulator::Now ();
+ switch (GetState ()) {
+ case WifiPhy::IDLE:
+ LogPreviousIdleAndCcaBusyStates ();
+ break;
+ case WifiPhy::CCA_BUSY: {
+ Time ccaStart = Max (m_endSync, m_endTx);
+ ccaStart = Max (ccaStart, m_startCcaBusy);
+ m_stateLogger (ccaStart, now - ccaStart, WifiPhy::CCA_BUSY);
+ } break;
+ case WifiPhy::SYNC:
+ case WifiPhy::TX:
+ NS_ASSERT (false);
+ break;
+ }
+ m_previousStateChangeTime = now;
+ m_syncing = true;
+ m_startSync = now;
+ m_endSync = now + rxDuration;
+ NS_ASSERT (IsStateSync ());
+}
+void
+WifiPhyStateHelper::SwitchFromSyncEndOk (Ptr<Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble)
+{
+ m_rxOkTrace (packet, snr, mode, preamble);
+ NotifySyncEndOk ();
+ DoSwitchFromSync ();
+ if (!m_syncOkCallback.IsNull ())
+ {
+ m_syncOkCallback (packet, snr, mode, preamble);
+ }
+
+}
+void
+WifiPhyStateHelper::SwitchFromSyncEndError (Ptr<const Packet> packet, double snr)
+{
+ m_rxErrorTrace (packet, snr);
+ NotifySyncEndError ();
+ DoSwitchFromSync ();
+ if (!m_syncErrorCallback.IsNull ())
+ {
+ // XXX
+ m_syncErrorCallback (packet->Copy (), snr);
+ }
+}
+
+void
+WifiPhyStateHelper::DoSwitchFromSync (void)
+{
+ NS_ASSERT (IsStateSync ());
+ NS_ASSERT (m_syncing);
+
+ Time now = Simulator::Now ();
+ m_stateLogger (m_startSync, now - m_startSync, WifiPhy::SYNC);
+ m_previousStateChangeTime = now;
+ m_syncing = false;
+
+ NS_ASSERT (IsStateIdle () || IsStateCcaBusy ());
+}
+void
+WifiPhyStateHelper::SwitchMaybeToCcaBusy (Time duration)
+{
+ NotifyCcaBusyStart (duration);
+ Time now = Simulator::Now ();
+ switch (GetState ()) {
+ case WifiPhy::IDLE:
+ LogPreviousIdleAndCcaBusyStates ();
+ break;
+ case WifiPhy::CCA_BUSY:
+ break;
+ case WifiPhy::SYNC:
+ break;
+ case WifiPhy::TX:
+ break;
+ }
+ m_startCcaBusy = now;
+ m_endCcaBusy = Max (m_endCcaBusy, now + duration);
+}
+
+} // namespace ns3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/wifi/wifi-phy-state-helper.h Thu Jun 12 11:05:46 2008 -0700
@@ -0,0 +1,67 @@
+#ifndef WIFI_PHY_STATE_HELPER_H
+#define WIFI_PHY_STATE_HELPER_H
+
+#include "wifi-phy.h"
+#include "ns3/traced-callback.h"
+#include <vector>
+
+namespace ns3 {
+
+class WifiPhyStateHelper
+{
+public:
+ WifiPhyStateHelper ();
+
+ void SetReceiveOkCallback (WifiPhy::SyncOkCallback callback);
+ void SetReceiveErrorCallback (WifiPhy::SyncErrorCallback callback);
+ void RegisterListener (WifiPhyListener *listener);
+ enum WifiPhy::State GetState (void);
+ bool IsStateCcaBusy (void);
+ bool IsStateIdle (void);
+ bool IsStateBusy (void);
+ bool IsStateSync (void);
+ bool IsStateTx (void);
+ Time GetStateDuration (void);
+ Time GetDelayUntilIdle (void);
+ Time GetLastRxStartTime (void) const;
+
+ void SwitchToTx (Time txDuration, Ptr<const Packet> packet, WifiMode txMode, WifiPreamble preamble, uint8_t txPower);
+ void SwitchToSync (Time syncDuration);
+ void SwitchFromSyncEndOk (Ptr<Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble);
+ void SwitchFromSyncEndError (Ptr<const Packet> packet, double snr);
+ void SwitchMaybeToCcaBusy (Time duration);
+
+private:
+ typedef std::vector<WifiPhyListener *> Listeners;
+
+ char const *StateToString (enum WifiPhy::State state);
+ void LogPreviousIdleAndCcaBusyStates (void);
+
+ void NotifyTxStart (Time duration);
+ void NotifyWakeup (void);
+ void NotifySyncStart (Time duration);
+ void NotifySyncEndOk (void);
+ void NotifySyncEndError (void);
+ void NotifyCcaBusyStart (Time duration);
+ void DoSwitchFromSync (void);
+
+ bool m_syncing;
+ Time m_endTx;
+ Time m_endSync;
+ Time m_endCcaBusy;
+ Time m_startTx;
+ Time m_startSync;
+ Time m_startCcaBusy;
+ Time m_previousStateChangeTime;
+ TracedCallback<Time,Time,enum WifiPhy::State> m_stateLogger;
+ Listeners m_listeners;
+ TracedCallback<Ptr<const Packet>, double, WifiMode, enum WifiPreamble> m_rxOkTrace;
+ TracedCallback<Ptr<const Packet>, double> m_rxErrorTrace;
+ TracedCallback<Ptr<const Packet>,WifiMode,WifiPreamble,uint8_t> m_txTrace;
+ WifiPhy::SyncOkCallback m_syncOkCallback;
+ WifiPhy::SyncErrorCallback m_syncErrorCallback;
+};
+
+} // namespace ns3
+
+#endif /* WIFI_PHY_STATE_HELPER_H */
--- a/src/devices/wifi/wscript Thu Jun 12 09:51:29 2008 -0700
+++ b/src/devices/wifi/wscript Thu Jun 12 11:05:46 2008 -0700
@@ -11,6 +11,7 @@
'wifi-mode.cc',
'ssid.cc',
'wifi-phy.cc',
+ 'wifi-phy-state-helper.cc',
'yans-wifi-phy.cc',
'yans-wifi-channel.cc',
'wifi-mac-header.cc',
@@ -55,6 +56,7 @@
'ssid.h',
'wifi-preamble.h',
'wifi-phy-standard.h',
+ 'wifi-phy-state-helper.h',
'yans-wifi-phy.h',
'yans-wifi-channel.h',
'wifi-phy.h',
--- a/src/devices/wifi/yans-wifi-phy.cc Thu Jun 12 09:51:29 2008 -0700
+++ b/src/devices/wifi/yans-wifi-phy.cc Thu Jun 12 11:05:46 2008 -0700
@@ -197,6 +197,7 @@
MakeEnumAccessor (&YansWifiPhy::SetStandard),
MakeEnumChecker (WIFI_PHY_STANDARD_80211a, "802.11a",
WIFI_PHY_STANDARD_holland, "holland"))
+#if 0
.AddTraceSource ("State",
"The YansWifiPhy state",
MakeTraceSourceAccessor (&YansWifiPhy::m_stateLogger))
@@ -208,21 +209,14 @@
MakeTraceSourceAccessor (&YansWifiPhy::m_rxErrorTrace))
.AddTraceSource ("Tx", "Packet transmission is starting.",
MakeTraceSourceAccessor (&YansWifiPhy::m_txTrace))
+#endif
;
return tid;
}
YansWifiPhy::YansWifiPhy ()
- : m_syncing (false),
- m_endTx (Seconds (0)),
- m_endSync (Seconds (0)),
- m_endCcaBusy (Seconds (0)),
- m_startTx (Seconds (0)),
- m_startSync (Seconds (0)),
- m_startCcaBusy (Seconds (0)),
- m_previousStateChangeTime (Seconds (0)),
- m_endSyncEvent (),
- m_random (0.0, 1.0)
+ : m_endSyncEvent (),
+ m_random (0.0, 1.0)
{
NS_LOG_FUNCTION (this);
}
@@ -349,12 +343,12 @@
void
YansWifiPhy::SetReceiveOkCallback (SyncOkCallback callback)
{
- m_syncOkCallback = callback;
+ m_state.SetReceiveOkCallback (callback);
}
void
YansWifiPhy::SetReceiveErrorCallback (SyncErrorCallback callback)
{
- m_syncErrorCallback = callback;
+ m_state.SetReceiveErrorCallback (callback);
}
void
YansWifiPhy::StartReceivePacket (Ptr<Packet> packet,
@@ -375,20 +369,24 @@
rxPowerW);
AppendEvent (event);
- switch (GetState ()) {
+ switch (m_state.GetState ()) {
case YansWifiPhy::SYNC:
NS_LOG_DEBUG ("drop packet because already in Sync (power="<<
rxPowerW<<"W)");
- if (endRx > m_endSync)
+ if (endRx > Simulator::Now () + m_state.GetDelayUntilIdle ())
{
+ // that packet will be noise _after_ the reception of the
+ // currently-received packet.
goto maybeCcaBusy;
}
break;
case YansWifiPhy::TX:
NS_LOG_DEBUG ("drop packet because already in Tx (power="<<
rxPowerW<<"W)");
- if (endRx > m_endTx)
+ if (endRx > Simulator::Now () + m_state.GetDelayUntilIdle ())
{
+ // that packet will be noise _after_ the transmission of the
+ // currently-transmitted packet.
goto maybeCcaBusy;
}
break;
@@ -398,8 +396,7 @@
{
NS_LOG_DEBUG ("sync (power="<<rxPowerW<<"W)");
// sync to signal
- NotifySyncStart (rxDuration);
- SwitchToSync (rxDuration);
+ m_state.SwitchToSync (rxDuration);
NS_ASSERT (m_endSyncEvent.IsExpired ());
m_endSyncEvent = Simulator::Schedule (rxDuration, &YansWifiPhy::EndSync, this,
packet,
@@ -420,8 +417,7 @@
if (rxPowerW > m_edThresholdW)
{
- SwitchMaybeToCcaBusy (rxDuration);
- NotifyCcaBusyStart (rxDuration);
+ m_state.SwitchMaybeToCcaBusy (rxDuration);
}
else
{
@@ -442,8 +438,7 @@
if (end > Simulator::Now ())
{
Time delta = end - Simulator::Now ();
- SwitchMaybeToCcaBusy (delta);
- NotifyCcaBusyStart (delta);
+ m_state.SwitchMaybeToCcaBusy (delta);
}
}
@@ -458,12 +453,14 @@
* prevent it.
* - we are idle
*/
- NS_ASSERT (!IsStateTx ());
+ NS_ASSERT (!m_state.IsStateTx ());
- m_txTrace (packet, txMode, preamble, txPower);
Time txDuration = CalculateTxDuration (packet->GetSize (), txMode, preamble);
- NotifyTxStart (txDuration);
- SwitchToTx (txDuration);
+ if (m_state.IsStateSync ())
+ {
+ m_endSyncEvent.Cancel ();
+ }
+ m_state.SwitchToTx (txDuration, packet, txMode, preamble, txPower);
m_channel->Send (this, packet, GetPowerDbm (txPower) + m_txGainDb, txMode, preamble);
}
@@ -570,73 +567,51 @@
void
YansWifiPhy::RegisterListener (WifiPhyListener *listener)
{
- m_listeners.push_back (listener);
+ m_state.RegisterListener (listener);
}
bool
YansWifiPhy::IsStateCcaBusy (void)
{
- return GetState () == CCA_BUSY;
+ return m_state.IsStateCcaBusy ();
}
bool
YansWifiPhy::IsStateIdle (void)
{
- return (GetState () == IDLE)?true:false;
+ return m_state.IsStateIdle ();
}
bool
YansWifiPhy::IsStateBusy (void)
{
- return (GetState () != IDLE)?true:false;
+ return m_state.IsStateBusy ();
}
bool
YansWifiPhy::IsStateSync (void)
{
- return (GetState () == SYNC)?true:false;
+ return m_state.IsStateSync ();
}
bool
YansWifiPhy::IsStateTx (void)
{
- return (GetState () == TX)?true:false;
+ return m_state.IsStateTx ();
}
Time
YansWifiPhy::GetStateDuration (void)
{
- return Simulator::Now () - m_previousStateChangeTime;
+ return m_state.GetStateDuration ();
}
Time
YansWifiPhy::GetDelayUntilIdle (void)
{
- Time retval;
-
- switch (GetState ()) {
- case SYNC:
- retval = m_endSync - Simulator::Now ();
- break;
- case TX:
- retval = m_endTx - Simulator::Now ();
- break;
- case CCA_BUSY:
- retval = m_endCcaBusy - Simulator::Now ();
- break;
- case IDLE:
- retval = Seconds (0);
- break;
- default:
- NS_ASSERT (false);
- // NOTREACHED
- retval = Seconds (0);
- break;
- }
- retval = Max (retval, Seconds (0));
- return retval;
+ return m_state.GetDelayUntilIdle ();
}
Time
YansWifiPhy::GetLastRxStartTime (void) const
{
- return m_startSync;
+ return m_state.GetLastRxStartTime ();
}
@@ -660,49 +635,6 @@
return MicroSeconds (delay);
}
-char const *
-YansWifiPhy::StateToString (enum State state)
-{
- switch (state) {
- case TX:
- return "TX";
- break;
- case CCA_BUSY:
- return "CCA_BUSY";
- break;
- case IDLE:
- return "IDLE";
- break;
- case SYNC:
- return "SYNC";
- break;
- default:
- NS_ASSERT (false);
- // quiet compiler
- return "INVALID";
- break;
- }
-}
-enum YansWifiPhy::State
-YansWifiPhy::GetState (void)
-{
- if (m_endTx > Simulator::Now ())
- {
- return YansWifiPhy::TX;
- }
- else if (m_syncing)
- {
- return YansWifiPhy::SYNC;
- }
- else if (m_endCcaBusy > Simulator::Now ())
- {
- return YansWifiPhy::CCA_BUSY;
- }
- else
- {
- return YansWifiPhy::IDLE;
- }
-}
double
YansWifiPhy::DbToRatio (double dB) const
@@ -751,146 +683,6 @@
return dbm;
}
-void
-YansWifiPhy::NotifyTxStart (Time duration)
-{
- for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
- (*i)->NotifyTxStart (duration);
- }
-}
-void
-YansWifiPhy::NotifySyncStart (Time duration)
-{
- for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
- (*i)->NotifyRxStart (duration);
- }
-}
-void
-YansWifiPhy::NotifySyncEndOk (void)
-{
- for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
- (*i)->NotifyRxEndOk ();
- }
-}
-void
-YansWifiPhy::NotifySyncEndError (void)
-{
- for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
- (*i)->NotifyRxEndError ();
- }
-}
-void
-YansWifiPhy::NotifyCcaBusyStart (Time duration)
-{
- for (Listeners::const_iterator i = m_listeners.begin (); i != m_listeners.end (); i++) {
- (*i)->NotifyCcaBusyStart (duration);
- }
-}
-
-void
-YansWifiPhy::LogPreviousIdleAndCcaBusyStates (void)
-{
- Time now = Simulator::Now ();
- Time idleStart = Max (m_endCcaBusy, m_endSync);
- idleStart = Max (idleStart, m_endTx);
- NS_ASSERT (idleStart <= now);
- if (m_endCcaBusy > m_endSync &&
- m_endCcaBusy > m_endTx) {
- Time ccaBusyStart = Max (m_endTx, m_endSync);
- ccaBusyStart = Max (ccaBusyStart, m_startCcaBusy);
- m_stateLogger (ccaBusyStart, idleStart - ccaBusyStart, YansWifiPhy::CCA_BUSY);
- }
- m_stateLogger (idleStart, now - idleStart, YansWifiPhy::IDLE);
-}
-
-void
-YansWifiPhy::SwitchToTx (Time txDuration)
-{
- Time now = Simulator::Now ();
- switch (GetState ()) {
- case YansWifiPhy::SYNC:
- /* The packet which is being received as well
- * as its endSync event are cancelled by the caller.
- */
- m_syncing = false;
- m_stateLogger (m_startSync, now - m_startSync, YansWifiPhy::SYNC);
- m_endSyncEvent.Cancel ();
- m_endSync = now;
- break;
- case YansWifiPhy::CCA_BUSY: {
- Time ccaStart = Max (m_endSync, m_endTx);
- ccaStart = Max (ccaStart, m_startCcaBusy);
- m_stateLogger (ccaStart, now - ccaStart, YansWifiPhy::CCA_BUSY);
- } break;
- case YansWifiPhy::IDLE:
- LogPreviousIdleAndCcaBusyStates ();
- break;
- default:
- NS_ASSERT (false);
- break;
- }
- m_stateLogger (now, txDuration, YansWifiPhy::TX);
- m_previousStateChangeTime = now;
- m_endTx = now + txDuration;
- m_startTx = now;
-}
-void
-YansWifiPhy::SwitchToSync (Time rxDuration)
-{
- NS_ASSERT (IsStateIdle () || IsStateCcaBusy ());
- NS_ASSERT (!m_syncing);
- Time now = Simulator::Now ();
- switch (GetState ()) {
- case YansWifiPhy::IDLE:
- LogPreviousIdleAndCcaBusyStates ();
- break;
- case YansWifiPhy::CCA_BUSY: {
- Time ccaStart = Max (m_endSync, m_endTx);
- ccaStart = Max (ccaStart, m_startCcaBusy);
- m_stateLogger (ccaStart, now - ccaStart, YansWifiPhy::CCA_BUSY);
- } break;
- case YansWifiPhy::SYNC:
- case YansWifiPhy::TX:
- NS_ASSERT (false);
- break;
- }
- m_previousStateChangeTime = now;
- m_syncing = true;
- m_startSync = now;
- m_endSync = now + rxDuration;
- NS_ASSERT (IsStateSync ());
-}
-void
-YansWifiPhy::SwitchFromSync (void)
-{
- NS_ASSERT (IsStateSync ());
- NS_ASSERT (m_syncing);
-
- Time now = Simulator::Now ();
- m_stateLogger (m_startSync, now - m_startSync, YansWifiPhy::SYNC);
- m_previousStateChangeTime = now;
- m_syncing = false;
-
- NS_ASSERT (IsStateIdle () || IsStateCcaBusy ());
-}
-void
-YansWifiPhy::SwitchMaybeToCcaBusy (Time duration)
-{
- Time now = Simulator::Now ();
- switch (GetState ()) {
- case YansWifiPhy::IDLE:
- LogPreviousIdleAndCcaBusyStates ();
- break;
- case YansWifiPhy::CCA_BUSY:
- break;
- case YansWifiPhy::SYNC:
- break;
- case YansWifiPhy::TX:
- break;
- }
- m_startCcaBusy = now;
- m_endCcaBusy = Max (m_endCcaBusy, now + duration);
-}
void
YansWifiPhy::AppendEvent (Ptr<RxEvent> event)
@@ -1334,24 +1126,12 @@
if (m_random.GetValue () > per)
{
- NotifySyncEndOk ();
- SwitchFromSync ();
- m_rxOkTrace (packet, snr, event->GetPayloadMode (), event->GetPreambleType ());
- if (!m_syncOkCallback.IsNull ())
- {
- m_syncOkCallback (packet, snr, event->GetPayloadMode (), event->GetPreambleType ());
- }
+ m_state.SwitchFromSyncEndOk (packet, snr, event->GetPayloadMode (), event->GetPreambleType ());
}
else
{
/* failure. */
- NotifySyncEndError ();
- SwitchFromSync ();
- m_rxErrorTrace (packet, snr);
- if (!m_syncErrorCallback.IsNull ())
- {
- m_syncErrorCallback (packet, snr);
- }
+ m_state.SwitchFromSyncEndError (packet, snr);
}
}
--- a/src/devices/wifi/yans-wifi-phy.h Thu Jun 12 09:51:29 2008 -0700
+++ b/src/devices/wifi/yans-wifi-phy.h Thu Jun 12 11:05:46 2008 -0700
@@ -36,6 +36,7 @@
#include "wifi-mode.h"
#include "wifi-preamble.h"
#include "wifi-phy-standard.h"
+#include "wifi-phy-state-helper.h"
namespace ns3 {
@@ -121,7 +122,6 @@
double m_delta;
};
typedef std::vector<WifiMode> Modes;
- typedef std::list<WifiPhyListener *> Listeners;
typedef std::list<Ptr<RxEvent> > Events;
typedef std::vector <NiChange> NiChanges;
@@ -131,8 +131,6 @@
void PrintModes (void) const;
void Configure80211a (void);
void ConfigureHolland (void);
- char const *StateToString (enum State state);
- enum YansWifiPhy::State GetState (void);
double GetEdThresholdW (void) const;
double DbmToW (double dbm) const;
double DbToRatio (double db) const;
@@ -141,17 +139,7 @@
Time GetMaxPacketDuration (void) const;
void CancelRx (void);
double GetPowerDbm (uint8_t power) const;
- void NotifyTxStart (Time duration);
- void NotifyWakeup (void);
- void NotifySyncStart (Time duration);
- void NotifySyncEndOk (void);
- void NotifySyncEndError (void);
- void NotifyCcaBusyStart (Time duration);
- void LogPreviousIdleAndCcaBusyStates (void);
- void SwitchToTx (Time txDuration);
- void SwitchToSync (Time syncDuration);
- void SwitchFromSync (void);
- void SwitchMaybeToCcaBusy (Time duration);
+
void AppendEvent (Ptr<RxEvent> event);
double CalculateNoiseInterferenceW (Ptr<RxEvent> event, NiChanges *ni) const;
double CalculateSnr (double signal, double noiseInterference, WifiMode mode) const;
@@ -193,28 +181,14 @@
uint32_t m_nTxPower;
- bool m_syncing;
- Time m_endTx;
- Time m_endSync;
- Time m_endCcaBusy;
- Time m_startTx;
- Time m_startSync;
- Time m_startCcaBusy;
- Time m_previousStateChangeTime;
Ptr<YansWifiChannel> m_channel;
- SyncOkCallback m_syncOkCallback;
- SyncErrorCallback m_syncErrorCallback;
- TracedCallback<Ptr<const Packet>, double, WifiMode, enum WifiPreamble> m_rxOkTrace;
- TracedCallback<Ptr<const Packet>, double> m_rxErrorTrace;
- TracedCallback<Ptr<const Packet>,WifiMode,WifiPreamble,uint8_t> m_txTrace;
Modes m_modes;
- Listeners m_listeners;
EventId m_endSyncEvent;
Events m_events;
UniformVariable m_random;
- TracedCallback<Time,Time,enum YansWifiPhy::State> m_stateLogger;
WifiPhyStandard m_standard;
+ WifiPhyStateHelper m_state;
};
} // namespace ns3