From 87d56eb866aeefc8129d0f822ec4188163402209 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Tue, 16 Oct 2007 13:32:48 +0200 Subject: [PATCH] use the new RandomStream class and fix a small bug in the testsuite --- src/devices/wifi/dcf.cc | 168 +++++++++++++++++++++++++++------------ src/devices/wifi/dcf.h | 12 +-- src/devices/wifi/wscript | 3 +- 3 files changed, 124 insertions(+), 59 deletions(-) diff --git a/src/devices/wifi/dcf.cc b/src/devices/wifi/dcf.cc index 7d4cdaf64..2732c10e7 100644 --- a/src/devices/wifi/dcf.cc +++ b/src/devices/wifi/dcf.cc @@ -18,31 +18,24 @@ * Author: Mathieu Lacage */ -#include -#include #include -#include "ns3/random-variable.h" #include "ns3/simulator.h" +#include "ns3/assert.h" +#include "ns3/log.h" #include "dcf.h" +#include "random-stream.h" #include "mac-parameters.h" - -#define noDCF_TRACE 1 - -#ifdef DCF_TRACE -# include -# define TRACE(x) \ - std::cout << "DCF " << x << std::endl; -#else /* DCF_TRACE */ -# define TRACE(x) -#endif /* DCF_TRACE */ +NS_LOG_COMPONENT_DEFINE ("Dcf"); namespace ns3 { + + DcfAccessListener::DcfAccessListener () {} DcfAccessListener::~DcfAccessListener () @@ -67,19 +60,19 @@ Dcf::Dcf () m_rxing (false) { ResetCw (); - m_random = new UniformVariable (); + m_rng = new RealRandomStream (); } Dcf::~Dcf () { - delete m_random; + delete m_rng; } void -Dcf::ResetRng (uint32_t seed) +Dcf::ResetRngForTest (RandomStream *stream) { - // XXX - // m_random->Reset (seed); + delete m_rng; + m_rng = stream; } void Dcf::SetParameters (MacParameters const*parameters) @@ -124,24 +117,24 @@ Dcf::RequestAccess (void) /* don't do anything. We will start a backoff and maybe * a timer when the txop notifies us of the end-of-access. */ - TRACE ("accessing. will be notified."); + NS_LOG_DEBUG ("accessing. will be notified."); } else if (m_accessTimerEvent.IsRunning ()) { /* we don't need to do anything because we have an access * timer which will expire soon. */ - TRACE ("access timer running. will be notified"); + NS_LOG_DEBUG ("access timer running. will be notified"); } else if (IsBackoffNotCompleted (Now ()) && m_accessTimerEvent.IsExpired ()) { /* start timer for ongoing backoff. */ - TRACE ("request access X delayed for="<AccessGrantedNow (); } } @@ -178,13 +171,13 @@ Dcf::AccessTimeout () UpdateBackoff (Now ()); if (m_backoffLeft.IsZero ()) { - TRACE ("timeout access granted"); + NS_LOG_DEBUG ("timeout access granted"); m_listener->AccessGrantedNow (); } else { Time delayUntilAccessGranted = GetDelayUntilAccessGranted (Now ()); - TRACE ("timeout access delayed for "<< delayUntilAccessGranted); + NS_LOG_DEBUG ("timeout access delayed for "<< delayUntilAccessGranted); m_accessTimerEvent = Simulator::Schedule (delayUntilAccessGranted, &Dcf::AccessTimeout, this); } @@ -198,10 +191,8 @@ Dcf::AccessTimeout () Time Dcf::PickBackoffDelay (void) { - // XXX - //uint32_t pickedCw = m_random->GetSingleValue (0, m_cw); - uint32_t pickedCw = 0; - TRACE ("cw="<GetNext (0, m_cw); + NS_LOG_DEBUG ("cw="<AccessGrantedNow (); } } @@ -314,13 +316,13 @@ Dcf::StartBackoff (void) { if (m_accessTimerEvent.IsRunning ()) { - TRACE ("no access needed because timer running."); + NS_LOG_DEBUG ("no access needed because timer running."); } if (!m_listener->AccessNeeded ()) { - TRACE ("no access needed."); + NS_LOG_DEBUG ("no access needed."); } - TRACE ("no access needed for now."); + NS_LOG_DEBUG ("no access needed for now."); } } Time @@ -353,6 +355,7 @@ Dcf::GetAccessGrantedStart (void) const busyAccessStart, txAccessStart, navAccessStart); + NS_LOG_DEBUG ("access granted start=" << accessGrantedStart); return accessGrantedStart; } @@ -388,8 +391,8 @@ Dcf::UpdateBackoff (Time time) return; } - //TRACE ("time: %f, backoffstart: %f\n", time, m_backoffStart); - assert (time >= m_backoffStart); + //NS_LOG_DEBUG ("time: %f, backoffstart: %f\n", time, m_backoffStart); + NS_ASSERT (time >= m_backoffStart); Time mostRecentEvent = MostRecent (m_backoffStart, GetAccessGrantedStart ()); @@ -397,9 +400,9 @@ Dcf::UpdateBackoff (Time time) { Time newBackoffLeft = m_backoffLeft - (time - mostRecentEvent); m_backoffLeft = Max (newBackoffLeft, Seconds (0)); - TRACE ("at="<ResetRng (0); + TestRandomStream *stream = new TestRandomStream (); + stream->AddNext (1); + stream->AddNext (1); + stream->AddNext (1); + stream->AddNext (1); + stream->AddNext (1); + stream->AddNext (1); + m_dcf->ResetRngForTest (stream); m_parameters = new MacParameters (); m_listener = new TestAccessListener (this); m_dcf->SetParameters (m_parameters); @@ -729,6 +740,11 @@ DcfTest::RunTests (void) { m_failed = false; + // 32 37 + // | rx ok | + // | idle | rx ok | nav busy | difs | backoff | + // 0 10 30 40 43 44 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 2+8); @@ -736,10 +752,15 @@ DcfTest::RunTests (void) AddAccessRequest (15); AddAccessRequest (16); AddAccessRequest (20); - ExpectAccessGranted (51); + ExpectAccessGranted (44); Simulator::Run (); EndTest (); + // 32 39 + // | rx ok | + // | idle | rx ok | nav busy | | difs | backoff | + // 0 10 30 37 42 43 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 2+5); @@ -747,7 +768,7 @@ DcfTest::RunTests (void) AddAccessRequest (15); AddAccessRequest (16); AddAccessRequest (20); - ExpectAccessGranted (50); + ExpectAccessGranted (43); Simulator::Run (); EndTest (); @@ -757,6 +778,11 @@ DcfTest::RunTests (void) Simulator::Run (); EndTest (); + // 32 39 + // | rx ok | + // | idle | rx ok | nav busy | difs | + // 0 10 30 40 43 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 2+8); @@ -766,6 +792,11 @@ DcfTest::RunTests (void) Simulator::Run (); EndTest (); + // 32 39 + // | rx ok | + // | idle | rx ok | nav busy | difs | + // 0 10 30 40 43 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 2+8); @@ -775,6 +806,11 @@ DcfTest::RunTests (void) Simulator::Run (); EndTest (); + // 32 39 + // | rx ok | + // | idle | rx ok | nav busy | difs | + // 0 10 30 40 43 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 2+8); @@ -784,6 +820,10 @@ DcfTest::RunTests (void) Simulator::Run (); EndTest (); + // + // | idle | rx error | idle | rx ok | difs | + // 0 10 30 31 38 41 + // StartTest (); AddRxErrorEvt (10, 20); AddRxOkEvt (31, 7); @@ -792,6 +832,10 @@ DcfTest::RunTests (void) Simulator::Run (); EndTest (); + // + // | idle | rx error | idle | rx error | eifs | + // 0 10 30 31 38 42 + // StartTest (); AddRxErrorEvt (10, 20); AddRxErrorEvt (31, 7); @@ -801,16 +845,28 @@ DcfTest::RunTests (void) EndTest (); + // + // 30 45 + // | nav busy | + // | idle | rx ok | idle | rx ok | difs | backoff | + // 0 10 30 35 45 48 49 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 200); AddRxOkEvt (35, 10); AddNavReset (45, 45, 0); AddAccessRequest (32); - ExpectAccessGranted (48); + ExpectAccessGranted (49); Simulator::Run (); EndTest (); + // + // 30 45 + // | nav busy | + // | idle | rx ok | idle | rx ok | + // 0 10 30 35 45 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 200); @@ -819,6 +875,12 @@ DcfTest::RunTests (void) Simulator::Run (); EndTest (); + // + // 30 45 + // | nav busy | + // | idle | rx ok | idle | rx ok | difs | + // 0 10 30 35 45 48 + // StartTest (); AddRxOkEvt (10, 20); AddNavStart (30, 30, 200); diff --git a/src/devices/wifi/dcf.h b/src/devices/wifi/dcf.h index a096f64db..a34c0b155 100644 --- a/src/devices/wifi/dcf.h +++ b/src/devices/wifi/dcf.h @@ -29,7 +29,7 @@ namespace ns3 { -class UniformVariable; +class RandomStream; class MacParameters; class DcfAccessListener { @@ -59,8 +59,6 @@ public: Dcf (); ~Dcf (); - void ResetRng (uint32_t seed); - void SetParameters (const MacParameters *parameters); void SetDifs (Time difs); void SetEifs (Time eifs); @@ -82,6 +80,9 @@ public: void NotifyNavReset (Time now, Time duration); void NotifyNavStart (Time now, Time duration); void NotifyNavContinue (Time now, Time duration); + + // for testing only. + void ResetRngForTest (RandomStream *stream); private: void AccessTimeout (void); @@ -96,7 +97,8 @@ private: uint32_t GetCwMax (void) const; /* time calculation helpers */ - bool IsPhyBusy (void); + bool IsPhyBusy (void) const; + bool IsNavBusy (void) const; bool IsBackoffNotCompleted (Time now); Time GetDelayUntilAccessGranted (Time now); Time GetAccessGrantedStart (void) const; @@ -104,7 +106,7 @@ private: EventId m_accessTimerEvent; - UniformVariable *m_random; + RandomStream *m_rng; const MacParameters *m_parameters; DcfAccessListener *m_listener; Time m_difs; diff --git a/src/devices/wifi/wscript b/src/devices/wifi/wscript index 36168a14e..3647196bf 100644 --- a/src/devices/wifi/wscript +++ b/src/devices/wifi/wscript @@ -31,7 +31,8 @@ def build(bld): 'mac-high-nqap.cc', 'mac-high-nqsta.cc', 'wifi-net-device.cc', - 'wifi-default-parameters.cc' + 'wifi-default-parameters.cc', + 'random-stream.cc' ] headers = bld.create_obj('ns3header') headers.source = [