|
|
| 68 |
|
68 |
|
| 69 |
|
69 |
|
| 70 |
private: |
70 |
private: |
| 71 |
void StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs); |
71 |
void StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue = 20); |
| 72 |
void AddDcfState (uint32_t aifsn); |
72 |
void AddDcfState (uint32_t aifsn); |
| 73 |
void EndTest (void); |
73 |
void EndTest (void); |
| 74 |
void ExpectInternalCollision (uint64_t time, uint32_t from, uint32_t nSlots); |
74 |
void ExpectInternalCollision (uint64_t time, uint32_t from, uint32_t nSlots); |
|
|
| 77 |
void AddRxErrorEvt (uint64_t at, uint64_t duration); |
77 |
void AddRxErrorEvt (uint64_t at, uint64_t duration); |
| 78 |
void AddNavReset (uint64_t at, uint64_t duration); |
78 |
void AddNavReset (uint64_t at, uint64_t duration); |
| 79 |
void AddNavStart (uint64_t at, uint64_t duration); |
79 |
void AddNavStart (uint64_t at, uint64_t duration); |
|
|
80 |
void AddAckTimeoutReset (uint64_t at); |
| 80 |
void AddAccessRequest (uint64_t at, uint64_t txTime, |
81 |
void AddAccessRequest (uint64_t at, uint64_t txTime, |
| 81 |
uint64_t expectedGrantTime, uint32_t from); |
82 |
uint64_t expectedGrantTime, uint32_t from); |
|
|
83 |
void AddAccessRequestWithAckTimeout (uint64_t at, uint64_t txTime, |
| 84 |
uint64_t expectedGrantTime, uint32_t from); |
| 85 |
///\param ackDelay is delay of the ack after txEnd |
| 86 |
void AddAccessRequestWithSuccessfullAck (uint64_t at, uint64_t txTime, |
| 87 |
uint64_t expectedGrantTime, uint32_t ackDelay, uint32_t from); |
| 82 |
void DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, DcfStateTest *state); |
88 |
void DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, DcfStateTest *state); |
| 83 |
|
89 |
|
| 84 |
typedef std::vector<DcfStateTest *> DcfStates; |
90 |
typedef std::vector<DcfStateTest *> DcfStates; |
| 85 |
|
91 |
|
| 86 |
DcfManager *m_dcfManager; |
92 |
DcfManager *m_dcfManager; |
| 87 |
DcfStates m_dcfStates; |
93 |
DcfStates m_dcfStates; |
|
|
94 |
uint32_t m_ackTimeoutValue; |
| 88 |
bool m_result; |
95 |
bool m_result; |
| 89 |
}; |
96 |
}; |
| 90 |
|
97 |
|
|
|
| 130 |
state->m_expectedGrants.pop_front (); |
137 |
state->m_expectedGrants.pop_front (); |
| 131 |
NS_TEST_ASSERT_EQUAL (Simulator::Now (), MicroSeconds (expected.second)); |
138 |
NS_TEST_ASSERT_EQUAL (Simulator::Now (), MicroSeconds (expected.second)); |
| 132 |
m_dcfManager->NotifyTxStartNow (MicroSeconds (expected.first)); |
139 |
m_dcfManager->NotifyTxStartNow (MicroSeconds (expected.first)); |
|
|
140 |
m_dcfManager->NotifyAckTimeoutStartNow (MicroSeconds (m_ackTimeoutValue + expected.first)); |
| 133 |
if (!result) |
141 |
if (!result) |
| 134 |
{ |
142 |
{ |
| 135 |
m_result = result; |
143 |
m_result = result; |
|
|
| 187 |
} |
195 |
} |
| 188 |
|
196 |
|
| 189 |
void |
197 |
void |
| 190 |
DcfManagerTest::StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs) |
198 |
DcfManagerTest::StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue) |
| 191 |
{ |
199 |
{ |
| 192 |
m_dcfManager = new DcfManager (); |
200 |
m_dcfManager = new DcfManager (); |
| 193 |
m_dcfManager->SetSlot (MicroSeconds (slotTime)); |
201 |
m_dcfManager->SetSlot (MicroSeconds (slotTime)); |
| 194 |
m_dcfManager->SetSifs (MicroSeconds (sifs)); |
202 |
m_dcfManager->SetSifs (MicroSeconds (sifs)); |
| 195 |
m_dcfManager->SetEifsNoDifs (MicroSeconds (eifsNoDifsNoSifs+sifs)); |
203 |
m_dcfManager->SetEifsNoDifs (MicroSeconds (eifsNoDifsNoSifs+sifs)); |
|
|
204 |
m_ackTimeoutValue = ackTimeoutValue; |
| 196 |
} |
205 |
} |
| 197 |
|
206 |
|
| 198 |
void |
207 |
void |
|
|
| 260 |
MicroSeconds (duration)); |
269 |
MicroSeconds (duration)); |
| 261 |
} |
270 |
} |
| 262 |
void |
271 |
void |
|
|
272 |
DcfManagerTest::AddAckTimeoutReset (uint64_t at) |
| 273 |
{ |
| 274 |
Simulator::Schedule (MicroSeconds (at) - Now (), |
| 275 |
&DcfManager::NotifyAckTimeoutResetNow, m_dcfManager); |
| 276 |
} |
| 277 |
void |
| 263 |
DcfManagerTest::AddAccessRequest (uint64_t at, uint64_t txTime, |
278 |
DcfManagerTest::AddAccessRequest (uint64_t at, uint64_t txTime, |
|
|
279 |
uint64_t expectedGrantTime, uint32_t from) |
| 280 |
{ |
| 281 |
AddAccessRequestWithSuccessfullAck (at, txTime, expectedGrantTime, 0, from); |
| 282 |
} |
| 283 |
void |
| 284 |
DcfManagerTest::AddAccessRequestWithAckTimeout (uint64_t at, uint64_t txTime, |
| 264 |
uint64_t expectedGrantTime, uint32_t from) |
285 |
uint64_t expectedGrantTime, uint32_t from) |
| 265 |
{ |
286 |
{ |
| 266 |
Simulator::Schedule (MicroSeconds (at) - Now (), |
287 |
Simulator::Schedule (MicroSeconds (at) - Now (), |
| 267 |
&DcfManagerTest::DoAccessRequest, this, |
288 |
&DcfManagerTest::DoAccessRequest, this, |
| 268 |
txTime, expectedGrantTime, m_dcfStates[from]); |
289 |
txTime, expectedGrantTime, m_dcfStates[from]); |
| 269 |
} |
290 |
} |
| 270 |
|
291 |
void |
|
|
292 |
DcfManagerTest::AddAccessRequestWithSuccessfullAck (uint64_t at, uint64_t txTime, |
| 293 |
uint64_t expectedGrantTime, uint32_t ackDelay, uint32_t from) |
| 294 |
{ |
| 295 |
NS_ASSERT(ackDelay < m_ackTimeoutValue); |
| 296 |
Simulator::Schedule (MicroSeconds (at) - Now (), |
| 297 |
&DcfManagerTest::DoAccessRequest, this, |
| 298 |
txTime, expectedGrantTime, m_dcfStates[from]); |
| 299 |
AddAckTimeoutReset (expectedGrantTime + txTime + ackDelay); |
| 300 |
} |
| 271 |
void |
301 |
void |
| 272 |
DcfManagerTest::DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, DcfStateTest *state) |
302 |
DcfManagerTest::DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, DcfStateTest *state) |
| 273 |
{ |
303 |
{ |
|
|
| 301 |
// | rx | sifs | aifsn | bslot0 | bslot1 | | rx | sifs | aifsn | bslot2 | bslot3 | tx | |
331 |
// | rx | sifs | aifsn | bslot0 | bslot1 | | rx | sifs | aifsn | bslot2 | bslot3 | tx | |
| 302 |
// | |
332 |
// | |
| 303 |
// 30 request access. backoff slots: 4 |
333 |
// 30 request access. backoff slots: 4 |
| 304 |
StartTest (4, 6 , 10); |
334 |
StartTest (4, 6, 10); |
| 305 |
AddDcfState (1); |
335 |
AddDcfState (1); |
| 306 |
AddRxOkEvt (20, 40); |
336 |
AddRxOkEvt (20, 40); |
| 307 |
AddRxOkEvt (80, 20); |
337 |
AddRxOkEvt (80, 20); |
|
|
| 388 |
ExpectCollision (40, 0, 1); // backoff: 0 slot |
418 |
ExpectCollision (40, 0, 1); // backoff: 0 slot |
| 389 |
ExpectInternalCollision (78, 1, 1); // backoff: 1 slot |
419 |
ExpectInternalCollision (78, 1, 1); // backoff: 1 slot |
| 390 |
EndTest (); |
420 |
EndTest (); |
|
|
421 |
|
| 422 |
// Test of AckTimeout handling: First queue requests access and ack procedure fails, |
| 423 |
// inside the ack timeout second queue with higher priority requests access. |
| 424 |
// |
| 425 |
// 20 40 50 60 66 76 |
| 426 |
// DCF0 - low | tx | ack timeout |sifs| | |
| 427 |
// DCF1 - high | | |sifs| tx | |
| 428 |
// ^ request access |
| 429 |
StartTest (4, 6, 10); |
| 430 |
AddDcfState (2); // high priority DCF |
| 431 |
AddDcfState (0); // low priority DCF |
| 432 |
AddAccessRequestWithAckTimeout (20, 20, 20, 0); |
| 433 |
AddAccessRequest (50, 10, 66, 1); |
| 434 |
EndTest (); |
| 391 |
|
435 |
|
|
|
436 |
// Test of AckTimeout handling: |
| 437 |
// |
| 438 |
// First queue requests access and ack is 2 us delayed (got ack interval at the picture), |
| 439 |
// inside this interval second queue with higher priority requests access. |
| 440 |
// |
| 441 |
// 20 40 41 42 48 58 |
| 442 |
// DCF0 - low | tx |got ack |sifs| | |
| 443 |
// DCF1 - high | | |sifs| tx | |
| 444 |
// ^ request access |
| 445 |
StartTest (4, 6, 10); |
| 446 |
AddDcfState (2); // high priority DCF |
| 447 |
AddDcfState (0); // low priority DCF |
| 448 |
AddAccessRequestWithSuccessfullAck (20, 20, 20, 2, 0); |
| 449 |
AddAccessRequest (41, 10, 48, 1); |
| 450 |
EndTest (); |
| 451 |
|
| 452 |
//Repeat the same but with one queue: |
| 453 |
// 20 40 41 42 48 58 |
| 454 |
// DCF0 - low | tx |got ack |sifs| | |
| 455 |
// ^ request access |
| 456 |
StartTest (4, 6, 10); |
| 457 |
AddDcfState (2); |
| 458 |
AddAccessRequestWithSuccessfullAck (20, 20, 20, 2, 0); |
| 459 |
AddAccessRequest (41, 10, 56, 0); |
| 460 |
EndTest (); |
| 461 |
|
| 462 |
//Repeat the same when ack was delayed: |
| 463 |
//and request the next access before previous tx end: |
| 464 |
// 20 39 40 42 64 74 |
| 465 |
// DCF0 - low | tx |got ack |sifs + 4 * slot| | |
| 466 |
// ^ request access |
| 467 |
StartTest (4, 6, 10); |
| 468 |
AddDcfState (2); |
| 469 |
AddAccessRequestWithSuccessfullAck (20, 20, 20, 2, 0); |
| 470 |
AddAccessRequest (39, 10, 64, 0); |
| 471 |
ExpectCollision (39, 2, 0); // backoff: 2 slot |
| 472 |
EndTest (); |
| 392 |
|
473 |
|
| 393 |
// |
474 |
// |
| 394 |
// test simple NAV count. This scenario modelizes a simple DATA+ACK handshake |
475 |
// test simple NAV count. This scenario modelizes a simple DATA+ACK handshake |
|
|
| 404 |
AddAccessRequest (30, 10, 93, 0); |
485 |
AddAccessRequest (30, 10, 93, 0); |
| 405 |
ExpectCollision (30, 2, 0); // backoff: 2 slot |
486 |
ExpectCollision (30, 2, 0); // backoff: 2 slot |
| 406 |
EndTest (); |
487 |
EndTest (); |
| 407 |
|
|
|
| 408 |
|
488 |
|
| 409 |
// |
489 |
// |
| 410 |
// test more complex NAV handling by a CF-poll. This scenario modelizes a |
490 |
// test more complex NAV handling by a CF-poll. This scenario modelizes a |