22 #include "ns3/simulator.h"
23 #include "ns3/dcf-manager.h"
33 void QueueTx (uint64_t txTime, uint64_t expectedGrantTime);
39 virtual void DoNotifyChannelSwitching (
void);
40 virtual void DoNotifyChannelSensing (
void);
42 typedef std::pair<uint64_t,uint64_t> ExpectedGrant;
43 typedef std::list<ExpectedGrant> ExpectedGrants;
49 typedef std::list<struct ExpectedCollision> ExpectedCollisions;
51 ExpectedCollisions m_expectedInternalCollision;
52 ExpectedCollisions m_expectedCollision;
53 ExpectedGrants m_expectedGrants;
63 virtual void DoRun (
void);
66 void NotifyAccessGranted (uint32_t i);
67 void NotifyInternalCollision (uint32_t i);
68 void NotifyCollision (uint32_t i);
69 void NotifyChannelSwitching (uint32_t i);
70 void NotifyChannelSensing (uint32_t i);
74 void StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue = 20);
75 void AddDcfState (uint32_t aifsn);
77 void ExpectInternalCollision (uint64_t time, uint32_t from, uint32_t nSlots);
78 void ExpectCollision (uint64_t time, uint32_t from, uint32_t nSlots);
79 void AddRxOkEvt (uint64_t at, uint64_t duration);
80 void AddRxErrorEvt (uint64_t at, uint64_t duration);
81 void AddRxInsideSifsEvt (uint64_t at, uint64_t duration);
82 void AddTxEvt (uint64_t at, uint64_t duration);
83 void AddNavReset (uint64_t at, uint64_t duration);
84 void AddNavStart (uint64_t at, uint64_t duration);
85 void AddAckTimeoutReset (uint64_t at);
86 void AddAccessRequest (uint64_t at, uint64_t txTime,
87 uint64_t expectedGrantTime, uint32_t from);
88 void AddAccessRequestWithAckTimeout (uint64_t at, uint64_t txTime,
89 uint64_t expectedGrantTime, uint32_t from);
96 uint64_t expectedGrantTime, uint32_t ackDelay, uint32_t from);
97 void DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime,
DcfStateTest *state);
98 void AddCcaBusyEvt (uint64_t at, uint64_t duration);
99 void AddSwitchingEvt (uint64_t at, uint64_t duration);
100 void AddRxStartEvt (uint64_t at, uint64_t duration);
102 typedef std::vector<DcfStateTest *> DcfStates;
105 DcfStates m_dcfStates;
106 uint32_t m_ackTimeoutValue;
117 DcfStateTest::QueueTx (uint64_t txTime, uint64_t expectedGrantTime)
119 m_expectedGrants.push_back (std::make_pair (txTime, expectedGrantTime));
124 m_test->NotifyAccessGranted (m_i);
129 m_test->NotifyInternalCollision (m_i);
134 m_test->NotifyCollision (m_i);
137 DcfStateTest::DoNotifyChannelSwitching (
void)
139 m_test->NotifyChannelSwitching (m_i);
141 void DcfStateTest::DoNotifyChannelSensing (
void)
143 m_test->NotifyChannelSensing (m_i);
147 DcfManagerTest::DcfManagerTest ()
148 : TestCase (
"DcfManager")
153 DcfManagerTest::NotifyAccessGranted (uint32_t i)
155 DcfStateTest *state = m_dcfStates[i];
156 NS_TEST_EXPECT_MSG_EQ (state->m_expectedGrants.empty (),
false,
"Have expected grants");
157 std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front ();
158 state->m_expectedGrants.pop_front ();
161 m_dcfManager->NotifyAckTimeoutStartNow (
MicroSeconds (m_ackTimeoutValue + expected.first));
164 DcfManagerTest::AddTxEvt (uint64_t at, uint64_t duration)
171 DcfManagerTest::NotifyInternalCollision (uint32_t i)
173 DcfStateTest *state = m_dcfStates[i];
174 NS_TEST_EXPECT_MSG_EQ (state->m_expectedInternalCollision.empty (),
false,
"Have expected internal collisions");
175 struct DcfStateTest::ExpectedCollision expected = state->m_expectedInternalCollision.front ();
176 state->m_expectedInternalCollision.pop_front ();
178 state->StartBackoffNow (expected.nSlots);
181 DcfManagerTest::NotifyCollision (uint32_t i)
183 DcfStateTest *state = m_dcfStates[i];
184 NS_TEST_EXPECT_MSG_EQ (state->m_expectedCollision.empty (),
false,
"Have expected collisions");
185 struct DcfStateTest::ExpectedCollision expected = state->m_expectedCollision.front ();
186 state->m_expectedCollision.pop_front ();
188 state->StartBackoffNow (expected.nSlots);
191 DcfManagerTest::NotifyChannelSwitching (uint32_t i)
193 DcfStateTest *state = m_dcfStates[i];
194 if (!state->m_expectedGrants.empty ())
196 std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front ();
197 state->m_expectedGrants.pop_front ();
202 DcfManagerTest::NotifyChannelSensing (uint32_t i)
204 DcfStateTest *state = m_dcfStates[i];
205 if (!state->m_expectedGrants.empty ())
207 std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front ();
208 state->m_expectedGrants.pop_front ();
214 DcfManagerTest::ExpectInternalCollision (uint64_t time, uint32_t nSlots, uint32_t from)
216 DcfStateTest *state = m_dcfStates[from];
217 struct DcfStateTest::ExpectedCollision col;
220 state->m_expectedInternalCollision.push_back (col);
223 DcfManagerTest::ExpectCollision (uint64_t time, uint32_t nSlots, uint32_t from)
225 DcfStateTest *state = m_dcfStates[from];
226 struct DcfStateTest::ExpectedCollision col;
229 state->m_expectedCollision.push_back (col);
233 DcfManagerTest::StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue)
235 m_dcfManager =
new DcfManager ();
239 m_ackTimeoutValue = ackTimeoutValue;
243 DcfManagerTest::AddDcfState (uint32_t aifsn)
245 DcfStateTest *state =
new DcfStateTest (
this, m_dcfStates.size ());
246 state->SetAifsn (aifsn);
247 m_dcfStates.push_back (state);
248 m_dcfManager->
Add (state);
252 DcfManagerTest::EndTest (
void)
256 for (DcfStates::const_iterator i = m_dcfStates.begin (); i != m_dcfStates.end (); i++)
258 DcfStateTest *state = *i;
259 NS_TEST_EXPECT_MSG_EQ (state->m_expectedGrants.empty (),
true,
"Have no expected grants");
260 NS_TEST_EXPECT_MSG_EQ (state->m_expectedInternalCollision.empty (),
true,
"Have no internal collisions");
261 NS_TEST_EXPECT_MSG_EQ (state->m_expectedCollision.empty (),
true,
"Have no expected collisions");
264 m_dcfStates.clear ();
269 DcfManagerTest::AddRxOkEvt (uint64_t at, uint64_t duration)
278 DcfManagerTest::AddRxInsideSifsEvt (uint64_t at, uint64_t duration)
285 DcfManagerTest::AddRxErrorEvt (uint64_t at, uint64_t duration)
295 DcfManagerTest::AddNavReset (uint64_t at, uint64_t duration)
302 DcfManagerTest::AddNavStart (uint64_t at, uint64_t duration)
309 DcfManagerTest::AddAckTimeoutReset (uint64_t at)
312 &DcfManager::NotifyAckTimeoutResetNow, m_dcfManager);
315 DcfManagerTest::AddAccessRequest (uint64_t at, uint64_t txTime,
316 uint64_t expectedGrantTime, uint32_t from)
321 DcfManagerTest::AddAccessRequestWithAckTimeout (uint64_t at, uint64_t txTime,
322 uint64_t expectedGrantTime, uint32_t from)
325 &DcfManagerTest::DoAccessRequest,
this,
326 txTime, expectedGrantTime, m_dcfStates[from]);
330 uint64_t expectedGrantTime, uint32_t ackDelay, uint32_t from)
332 NS_ASSERT (ackDelay < m_ackTimeoutValue);
334 &DcfManagerTest::DoAccessRequest,
this,
335 txTime, expectedGrantTime, m_dcfStates[from]);
336 AddAckTimeoutReset (expectedGrantTime + txTime + ackDelay);
339 DcfManagerTest::DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime,
DcfStateTest *state)
341 state->QueueTx (txTime, expectedGrantTime);
345 DcfManagerTest::AddCcaBusyEvt (uint64_t at, uint64_t duration)
352 DcfManagerTest::AddSwitchingEvt (uint64_t at, uint64_t duration)
359 DcfManagerTest::AddRxStartEvt (uint64_t at, uint64_t duration)
374 StartTest (1, 3, 10);
376 AddAccessRequest (1, 1, 4, 0);
377 AddAccessRequest (10, 2, 10, 0);
383 StartTest (1, 3, 10);
385 AddAccessRequest (1, 1, 4, 0);
386 AddRxInsideSifsEvt (6, 10);
388 AddAccessRequest (14, 2, 14, 0);
401 StartTest (4, 6, 10);
405 AddAccessRequest (30, 2, 118, 0);
406 ExpectCollision (30, 4, 0);
415 StartTest (4, 6, 10);
418 AddAccessRequest (30, 2, 70, 0);
419 ExpectCollision (30, 0, 0);
428 StartTest (4, 6, 10);
432 AddAccessRequest (30, 2, 110, 0);
433 ExpectCollision (30, 0, 0);
450 StartTest (4, 6, 10);
453 AddAccessRequest (62, 2, 70, 0);
463 StartTest (4, 6, 10);
465 AddRxErrorEvt (20, 40);
466 AddAccessRequest (30, 2, 102, 0);
467 ExpectCollision (30, 4, 0);
476 StartTest (4, 6, 10);
478 AddRxErrorEvt (20, 40);
479 AddAccessRequest (30, 2, 101, 0);
480 ExpectCollision (30, 4, 0);
492 StartTest (4, 6, 10);
496 AddAccessRequest (30, 10, 78, 0);
497 ExpectCollision (30, 2, 0);
499 AddAccessRequest (40, 2, 110, 1);
500 ExpectCollision (40, 0, 1);
501 ExpectInternalCollision (78, 1, 1);
511 StartTest (4, 6, 10);
514 AddAccessRequestWithAckTimeout (20, 20, 20, 0);
515 AddAccessRequest (50, 10, 66, 1);
527 StartTest (4, 6, 10);
531 AddAccessRequest (41, 10, 48, 1);
538 StartTest (4, 6, 10);
541 AddAccessRequest (41, 10, 56, 0);
549 StartTest (4, 6, 10);
552 AddAccessRequest (39, 10, 64, 0);
553 ExpectCollision (39, 2, 0);
561 StartTest (4, 6, 10);
564 AddNavStart (60, 15);
567 AddAccessRequest (30, 10, 93, 0);
568 ExpectCollision (30, 2, 0);
576 StartTest (4, 6, 10);
579 AddNavStart (60, 15);
582 AddAccessRequest (30, 10, 91, 0);
583 ExpectCollision (30, 2, 0);
587 StartTest (4, 6, 10);
590 AddAccessRequest (80, 10, 80, 0);
594 StartTest (4, 6, 10);
598 AddAccessRequest (30, 50, 108, 0);
599 ExpectCollision (30, 3, 0);
609 StartTest (1, 3, 10);
611 AddSwitchingEvt (0,20);
612 AddAccessRequest (21, 1, 24, 0);
620 StartTest (1, 3, 10);
622 AddSwitchingEvt (20,20);
623 AddCcaBusyEvt (30,20);
624 AddAccessRequest (45, 1, 54, 0);
632 StartTest (1, 3, 10);
634 AddRxStartEvt (20,40);
635 AddSwitchingEvt (30,20);
636 AddAccessRequest (51, 1, 54, 0);
644 StartTest (1, 3, 10);
646 AddCcaBusyEvt (20,40);
647 AddSwitchingEvt (30,20);
648 AddAccessRequest (51, 1, 54, 0);
656 StartTest (1, 3, 10);
659 AddSwitchingEvt (30,20);
660 AddAccessRequest (51, 1, 54, 0);
668 StartTest (1, 3, 10);
670 AddAccessRequestWithAckTimeout (20, 20, 20, 0);
671 AddAccessRequest (45, 1, 50, 0);
672 AddSwitchingEvt (50,5);
673 AddAccessRequest (56, 1, 59, 0);
681 StartTest (4, 6, 10);
684 AddAccessRequest (30, 2, 80, 0);
685 ExpectCollision (30, 4, 0);
686 AddSwitchingEvt (80,20);
687 AddAccessRequest (101, 2, 110, 0);
699 DcfTestSuite::DcfTestSuite ()
705 static DcfTestSuite g_dcfTestSuite;
virtual void DoNotifyCollision(void)
void RequestAccess(DcfState *state)
#define NS_ASSERT(condition)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
void NotifyNavResetNow(Time duration)
void NotifyRxEndOkNow(void)
void NotifyTxStartNow(Time duration)
Manage a set of ns3::DcfStateHandle a set of independent ns3::DcfState, each of which represents a si...
void AddAccessRequestWithSuccessfullAck(uint64_t at, uint64_t txTime, uint64_t expectedGrantTime, uint32_t ackDelay, uint32_t from)
keep track of the state needed for a single DCF function.Multiple instances of a DcfState can be regi...
static void Destroy(void)
virtual void DoRun(void)
Implementation to actually run this test case.
void NotifyRxEndErrorNow(void)
virtual void DoNotifyInternalCollision(void)
void SetEifsNoDifs(Time eifsNoDifs)
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual test case to this test suite.
void NotifyMaybeCcaBusyStartNow(Time duration)
void SetSlot(Time slotTime)
void NotifyNavStartNow(Time duration)
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
void NotifyRxStartNow(Time duration)
virtual void DoNotifyAccessGranted(void)
void NotifySwitchingStartNow(Time duration, uint16_t toChannel)
Time MicroSeconds(uint64_t us)
create ns3::Time instances in units of microseconds.