LEFT | RIGHT |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2009 Duy Nguyen | 3 * Copyright (c) 2009 Duy Nguyen |
4 * Copyright (c) 2015 Ghada Badawy | 4 * Copyright (c) 2015 Ghada Badawy |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License version 2 as | 7 * it under the terms of the GNU General Public License version 2 as |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 txvector.SetNss (streams); | 320 txvector.SetNss (streams); |
321 txvector.SetChannelWidth (chWidth); | 321 txvector.SetChannelWidth (chWidth); |
322 txvector.SetMode (mode); | 322 txvector.SetMode (mode); |
323 return txvector.IsValid (); | 323 return txvector.IsValid (); |
324 } | 324 } |
325 | 325 |
326 Time | 326 Time |
327 MinstrelHtWifiManager::CalculateFirstMpduTxDuration (Ptr<WifiPhy> phy, uint8_t s
treams, uint8_t sgi, uint8_t chWidth, WifiMode mode) | 327 MinstrelHtWifiManager::CalculateFirstMpduTxDuration (Ptr<WifiPhy> phy, uint8_t s
treams, uint8_t sgi, uint8_t chWidth, WifiMode mode) |
328 { | 328 { |
329 NS_LOG_FUNCTION (this << phy << static_cast<uint16_t> (streams) << static_cast
<uint16_t> (sgi) << static_cast<uint16_t> (chWidth) << mode); | 329 NS_LOG_FUNCTION (this << phy << static_cast<uint16_t> (streams) << static_cast
<uint16_t> (sgi) << static_cast<uint16_t> (chWidth) << mode); |
330 | |
331 WifiTxVector txvector; | 330 WifiTxVector txvector; |
332 txvector.SetNss (streams); | 331 txvector.SetNss (streams); |
333 txvector.SetGuardInterval (sgi ? 400 : 800); | 332 txvector.SetGuardInterval (sgi ? 400 : 800); |
334 txvector.SetChannelWidth (chWidth); | 333 txvector.SetChannelWidth (chWidth); |
335 txvector.SetNess (0); | 334 txvector.SetNess (0); |
336 txvector.SetStbc (phy->GetStbc ()); | 335 txvector.SetStbc (phy->GetStbc ()); |
337 txvector.SetMode (mode); | 336 txvector.SetMode (mode); |
338 txvector.SetPreambleType (WIFI_PREAMBLE_HT_MF); | 337 txvector.SetPreambleType (WIFI_PREAMBLE_HT_MF); |
339 return phy->CalculateTxDuration (m_frameLength, txvector, phy->GetFrequency ()
, MPDU_IN_AGGREGATE, 0); | 338 return phy->CalculateTxDuration (m_frameLength, txvector, phy->GetFrequency ()
, MPDU_IN_AGGREGATE, 0); |
340 } | 339 } |
341 | 340 |
342 Time | 341 Time |
343 MinstrelHtWifiManager::CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t stream
s, uint8_t sgi, uint8_t chWidth, WifiMode mode) | 342 MinstrelHtWifiManager::CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t stream
s, uint8_t sgi, uint8_t chWidth, WifiMode mode) |
344 { | 343 { |
345 NS_LOG_FUNCTION (this << phy << static_cast<uint16_t> (streams) << static_cast
<uint16_t> (sgi) << static_cast<uint16_t> (chWidth) << mode); | 344 NS_LOG_FUNCTION (this << phy << static_cast<uint16_t> (streams) << static_cast
<uint16_t> (sgi) << static_cast<uint16_t> (chWidth) << mode); |
346 | |
347 WifiTxVector txvector; | 345 WifiTxVector txvector; |
348 txvector.SetNss (streams); | 346 txvector.SetNss (streams); |
349 txvector.SetGuardInterval (sgi ? 400 : 800); | 347 txvector.SetGuardInterval (sgi ? 400 : 800); |
350 txvector.SetChannelWidth (chWidth); | 348 txvector.SetChannelWidth (chWidth); |
351 txvector.SetNess (0); | 349 txvector.SetNess (0); |
352 txvector.SetStbc (phy->GetStbc ()); | 350 txvector.SetStbc (phy->GetStbc ()); |
353 txvector.SetMode (mode); | 351 txvector.SetMode (mode); |
354 txvector.SetPreambleType (WIFI_PREAMBLE_NONE); | 352 txvector.SetPreambleType (WIFI_PREAMBLE_NONE); |
355 return phy->CalculateTxDuration (m_frameLength, txvector, phy->GetFrequency ()
, MPDU_IN_AGGREGATE, 0); | 353 return phy->CalculateTxDuration (m_frameLength, txvector, phy->GetFrequency ()
, MPDU_IN_AGGREGATE, 0); |
356 } | 354 } |
357 | 355 |
358 Time | 356 Time |
359 MinstrelHtWifiManager::GetFirstMpduTxTime (uint32_t groupId, WifiMode mode) cons
t | 357 MinstrelHtWifiManager::GetFirstMpduTxTime (uint32_t groupId, WifiMode mode) cons
t |
360 { | 358 { |
361 NS_LOG_FUNCTION (this << groupId << mode); | 359 NS_LOG_FUNCTION (this << groupId << mode); |
362 | |
363 for (TxTime::const_iterator i = m_minstrelGroups[groupId].ratesFirstMpduTxTime
Table.begin (); i != m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.end ();
i++) | 360 for (TxTime::const_iterator i = m_minstrelGroups[groupId].ratesFirstMpduTxTime
Table.begin (); i != m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.end ();
i++) |
364 { | 361 { |
365 if (mode == i->second) | 362 if (mode == i->second) |
366 { | 363 { |
367 return i->first; | 364 return i->first; |
368 } | 365 } |
369 } | 366 } |
370 NS_ASSERT (false); | 367 NS_ASSERT (false); |
371 return Seconds (0); | 368 return Seconds (0); |
372 } | 369 } |
373 | 370 |
374 void | 371 void |
375 MinstrelHtWifiManager::AddFirstMpduTxTime (uint32_t groupId, WifiMode mode, Time
t) | 372 MinstrelHtWifiManager::AddFirstMpduTxTime (uint32_t groupId, WifiMode mode, Time
t) |
376 { | 373 { |
377 NS_LOG_FUNCTION (this << groupId << mode << t); | 374 NS_LOG_FUNCTION (this << groupId << mode << t); |
378 | |
379 m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.push_back (std::make_pair
(t, mode)); | 375 m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.push_back (std::make_pair
(t, mode)); |
380 } | 376 } |
381 | 377 |
382 Time | 378 Time |
383 MinstrelHtWifiManager::GetMpduTxTime (uint32_t groupId, WifiMode mode) const | 379 MinstrelHtWifiManager::GetMpduTxTime (uint32_t groupId, WifiMode mode) const |
384 { | 380 { |
385 NS_LOG_FUNCTION (this << groupId << mode); | 381 NS_LOG_FUNCTION (this << groupId << mode); |
386 | |
387 for (TxTime::const_iterator i = m_minstrelGroups[groupId].ratesTxTimeTable.beg
in (); i != m_minstrelGroups[groupId].ratesTxTimeTable.end (); i++) | 382 for (TxTime::const_iterator i = m_minstrelGroups[groupId].ratesTxTimeTable.beg
in (); i != m_minstrelGroups[groupId].ratesTxTimeTable.end (); i++) |
388 { | 383 { |
389 if (mode == i->second) | 384 if (mode == i->second) |
390 { | 385 { |
391 return i->first; | 386 return i->first; |
392 } | 387 } |
393 } | 388 } |
394 NS_ASSERT (false); | 389 NS_ASSERT (false); |
395 return Seconds (0); | 390 return Seconds (0); |
396 } | 391 } |
397 | 392 |
398 void | 393 void |
399 MinstrelHtWifiManager::AddMpduTxTime (uint32_t groupId, WifiMode mode, Time t) | 394 MinstrelHtWifiManager::AddMpduTxTime (uint32_t groupId, WifiMode mode, Time t) |
400 { | 395 { |
401 NS_LOG_FUNCTION (this << groupId << mode << t); | 396 NS_LOG_FUNCTION (this << groupId << mode << t); |
402 | |
403 m_minstrelGroups[groupId].ratesTxTimeTable.push_back (std::make_pair (t, mode)
); | 397 m_minstrelGroups[groupId].ratesTxTimeTable.push_back (std::make_pair (t, mode)
); |
404 } | 398 } |
405 | 399 |
406 WifiRemoteStation * | 400 WifiRemoteStation * |
407 MinstrelHtWifiManager::DoCreateStation (void) const | 401 MinstrelHtWifiManager::DoCreateStation (void) const |
408 { | 402 { |
409 NS_LOG_FUNCTION (this); | 403 NS_LOG_FUNCTION (this); |
410 | |
411 MinstrelHtWifiRemoteStation *station = new MinstrelHtWifiRemoteStation (); | 404 MinstrelHtWifiRemoteStation *station = new MinstrelHtWifiRemoteStation (); |
412 | 405 |
413 // Initialize variables common to both stations. | 406 // Initialize variables common to both stations. |
414 station->m_nextStatsUpdate = Simulator::Now () + m_updateStats; | 407 station->m_nextStatsUpdate = Simulator::Now () + m_updateStats; |
415 station->m_col = 0; | 408 station->m_col = 0; |
416 station->m_index = 0; | 409 station->m_index = 0; |
417 station->m_maxTpRate = 0; | 410 station->m_maxTpRate = 0; |
418 station->m_maxTpRate2 = 0; | 411 station->m_maxTpRate2 = 0; |
419 station->m_maxProbRate = 0; | 412 station->m_maxProbRate = 0; |
420 station->m_nModes = 0; | 413 station->m_nModes = 0; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 station->m_isHt = false; | 447 station->m_isHt = false; |
455 } | 448 } |
456 | 449 |
457 return station; | 450 return station; |
458 } | 451 } |
459 | 452 |
460 void | 453 void |
461 MinstrelHtWifiManager::CheckInit (MinstrelHtWifiRemoteStation *station) | 454 MinstrelHtWifiManager::CheckInit (MinstrelHtWifiRemoteStation *station) |
462 { | 455 { |
463 NS_LOG_FUNCTION (this << station); | 456 NS_LOG_FUNCTION (this << station); |
464 | |
465 // Note: we appear to be doing late initialization of the table | 457 // Note: we appear to be doing late initialization of the table |
466 // to make sure that the set of supported rates has been initialized | 458 // to make sure that the set of supported rates has been initialized |
467 // before we perform our own initialization. | 459 // before we perform our own initialization. |
468 if (!station->m_initialized) | 460 if (!station->m_initialized) |
469 { | 461 { |
470 /** | 462 /** |
471 * Check if the station supports HT. | 463 * Check if the station supports HT. |
472 * Assume that if the device do not supports HT then | 464 * Assume that if the device do not supports HT then |
473 * the station will not support HT either. | 465 * the station will not support HT either. |
474 * We save from using another check and variable. | 466 * We save from using another check and variable. |
475 */ | 467 */ |
476 if (!GetHtSupported (station) && !GetVhtSupported (station)) | 468 if (!GetHtSupported (station) && !GetVhtSupported (station)) |
477 { | 469 { |
478 NS_LOG_DEBUG ("Non-HT station " << station); | 470 NS_LOG_INFO ("Non-HT station " << station); |
479 station->m_isHt = false; | 471 station->m_isHt = false; |
480 // We will use non-HT minstrel for this station. Initialize the manage
r. | 472 // We will use non-HT minstrel for this station. Initialize the manage
r. |
481 m_legacyManager->SetAttribute ("UpdateStatistics", TimeValue (m_update
Stats)); | 473 m_legacyManager->SetAttribute ("UpdateStatistics", TimeValue (m_update
Stats)); |
482 m_legacyManager->SetAttribute ("LookAroundRate", DoubleValue (m_lookAr
oundRate)); | 474 m_legacyManager->SetAttribute ("LookAroundRate", DoubleValue (m_lookAr
oundRate)); |
483 m_legacyManager->SetAttribute ("EWMA", DoubleValue (m_ewmaLevel)); | 475 m_legacyManager->SetAttribute ("EWMA", DoubleValue (m_ewmaLevel)); |
484 m_legacyManager->SetAttribute ("SampleColumn", UintegerValue (m_nSampl
eCol)); | 476 m_legacyManager->SetAttribute ("SampleColumn", UintegerValue (m_nSampl
eCol)); |
485 m_legacyManager->SetAttribute ("PacketLength", UintegerValue (m_frameL
ength)); | 477 m_legacyManager->SetAttribute ("PacketLength", UintegerValue (m_frameL
ength)); |
486 m_legacyManager->SetAttribute ("PrintStats", BooleanValue (m_printStat
s)); | 478 m_legacyManager->SetAttribute ("PrintStats", BooleanValue (m_printStat
s)); |
487 m_legacyManager->CheckInit (station); | 479 m_legacyManager->CheckInit (station); |
488 } | 480 } |
489 else | 481 else |
490 { | 482 { |
491 NS_LOG_DEBUG ("HT station " << station); | 483 NS_LOG_DEBUG ("HT station " << station); |
492 station->m_isHt = true; | 484 station->m_isHt = true; |
493 station->m_nModes = GetNMcsSupported (station); | 485 station->m_nModes = GetNMcsSupported (station); |
494 station->m_sampleTable = SampleRate (m_numRates, std::vector<uint32_t>
(m_nSampleCol)); | 486 station->m_sampleTable = SampleRate (m_numRates, std::vector<uint32_t>
(m_nSampleCol)); |
495 InitSampleTable (station); | 487 InitSampleTable (station); |
496 RateInit (station); | 488 RateInit (station); |
497 std::ostringstream tmp; | 489 std::ostringstream tmp; |
498 tmp << "minstrel-ht-stats-" << station->m_state->m_address << ".txt"; | 490 tmp << "minstrel-ht-stats-" << station->m_state->m_address << ".txt"; |
499 station->m_statsFile.open (tmp.str ().c_str (), std::ios::out); | 491 station->m_statsFile.open (tmp.str ().c_str (), std::ios::out); |
500 station->m_initialized = true; | 492 station->m_initialized = true; |
501 } | 493 } |
502 } | 494 } |
503 } | 495 } |
504 | 496 |
505 void | 497 void |
506 MinstrelHtWifiManager::DoReportRxOk (WifiRemoteStation *st, | 498 MinstrelHtWifiManager::DoReportRxOk (WifiRemoteStation *st, double rxSnr, WifiMo
de txMode) |
507 double rxSnr, WifiMode txMode) | |
508 { | 499 { |
509 NS_UNUSED(rxSnr); | 500 NS_UNUSED(rxSnr); |
510 NS_UNUSED(txMode); | 501 NS_UNUSED(txMode); |
511 NS_LOG_FUNCTION (this << st); | 502 NS_LOG_FUNCTION (this << st); |
512 | |
513 NS_LOG_DEBUG ("DoReportRxOk m_txrate=" << ((MinstrelHtWifiRemoteStation *)st)-
>m_txrate); | 503 NS_LOG_DEBUG ("DoReportRxOk m_txrate=" << ((MinstrelHtWifiRemoteStation *)st)-
>m_txrate); |
514 } | 504 } |
515 | 505 |
516 void | 506 void |
517 MinstrelHtWifiManager::DoReportRtsFailed (WifiRemoteStation *st) | 507 MinstrelHtWifiManager::DoReportRtsFailed (WifiRemoteStation *st) |
518 { | 508 { |
519 NS_LOG_FUNCTION (this << st); | 509 NS_LOG_FUNCTION (this << st); |
520 | |
521 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *)st; | 510 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *)st; |
522 | |
523 CheckInit (station); | 511 CheckInit (station); |
524 if (!station->m_initialized) | 512 if (!station->m_initialized) |
525 { | 513 { |
526 return; | 514 return; |
527 } | 515 } |
528 | |
529 NS_LOG_DEBUG ("DoReportRtsFailed m_txrate=" << station->m_txrate); | 516 NS_LOG_DEBUG ("DoReportRtsFailed m_txrate=" << station->m_txrate); |
530 station->m_shortRetry++; | 517 station->m_shortRetry++; |
531 } | 518 } |
532 | 519 |
533 void | 520 void |
534 MinstrelHtWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, Wifi
Mode ctsMode, double rtsSnr) | 521 MinstrelHtWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, Wifi
Mode ctsMode, double rtsSnr) |
535 { | 522 { |
536 NS_UNUSED(ctsSnr); | 523 NS_UNUSED(ctsSnr); |
537 NS_UNUSED(ctsMode); | 524 NS_UNUSED(ctsMode); |
538 NS_UNUSED(rtsSnr); | 525 NS_UNUSED(rtsSnr); |
539 NS_LOG_FUNCTION (this << st); | 526 NS_LOG_FUNCTION (this << st); |
540 | |
541 NS_LOG_DEBUG ("self=" << st << " rts ok"); | 527 NS_LOG_DEBUG ("self=" << st << " rts ok"); |
542 } | 528 } |
543 | 529 |
544 void | 530 void |
545 MinstrelHtWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st) | 531 MinstrelHtWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st) |
546 { | 532 { |
547 NS_LOG_FUNCTION (this << st); | 533 NS_LOG_FUNCTION (this << st); |
548 | |
549 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *)st; | 534 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *)st; |
550 NS_LOG_DEBUG ("Final RTS failed"); | 535 NS_LOG_DEBUG ("Final RTS failed"); |
551 | |
552 CheckInit (station); | 536 CheckInit (station); |
553 if (!station->m_initialized) | 537 if (!station->m_initialized) |
554 { | 538 { |
555 return; | 539 return; |
556 } | 540 } |
557 | |
558 UpdateRetry (station); | 541 UpdateRetry (station); |
559 } | 542 } |
560 | 543 |
561 void | 544 void |
562 MinstrelHtWifiManager::DoReportDataFailed (WifiRemoteStation *st) | 545 MinstrelHtWifiManager::DoReportDataFailed (WifiRemoteStation *st) |
563 { | 546 { |
564 NS_LOG_FUNCTION (this << st); | 547 NS_LOG_FUNCTION (this << st); |
565 | |
566 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *)st; | 548 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *)st; |
567 | 549 |
568 CheckInit (station); | 550 CheckInit (station); |
569 if (!station->m_initialized) | 551 if (!station->m_initialized) |
570 { | 552 { |
571 return; | 553 return; |
572 } | 554 } |
573 | 555 |
| 556 NS_LOG_DEBUG ("DoReportDataFailed " << station << "\t rate " << station->m_txr
ate << "\tlongRetry \t" << station->m_longRetry); |
| 557 |
574 if (!station->m_isHt) | 558 if (!station->m_isHt) |
575 { | 559 { |
576 m_legacyManager->UpdateRate (station); | 560 m_legacyManager->UpdateRate (station); |
577 } | 561 } |
578 else | 562 else |
579 { | 563 { |
580 NS_LOG_DEBUG ("DoReportDataFailed " << station << "\t rate " << station->m
_txrate << "\tlongRetry \t" << station->m_longRetry); | |
581 | |
582 uint32_t rateId = GetRateId (station->m_txrate); | 564 uint32_t rateId = GetRateId (station->m_txrate); |
583 uint32_t groupId = GetGroupId (station->m_txrate); | 565 uint32_t groupId = GetGroupId (station->m_txrate); |
584 station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++; //
Increment the attempts counter for the rate used. | 566 station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++; //
Increment the attempts counter for the rate used. |
585 | |
586 UpdateRate (station); | 567 UpdateRate (station); |
587 } | 568 } |
588 } | 569 } |
589 | 570 |
590 void | 571 void |
591 MinstrelHtWifiManager::DoReportDataOk (WifiRemoteStation *st, | 572 MinstrelHtWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, Wif
iMode ackMode, double dataSnr) |
592 double ackSnr, WifiMode ackMode, double d
ataSnr) | |
593 { | 573 { |
594 NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr); | 574 NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr); |
595 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *) st; | 575 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *) st; |
596 | 576 |
597 CheckInit (station); | 577 CheckInit (station); |
598 if (!station->m_initialized) | 578 if (!station->m_initialized) |
599 { | 579 { |
600 return; | 580 return; |
601 } | 581 } |
602 | 582 |
603 NS_LOG_DEBUG ("Data OK - Txrate = " << station->m_txrate ); | 583 NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt
= " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success
= " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (before u
pdate)."); |
604 | 584 |
605 if (!station->m_isHt) | 585 if (!station->m_isHt) |
606 { | 586 { |
607 station->m_minstrelTable[station->m_txrate].numRateSuccess++; | 587 station->m_minstrelTable[station->m_txrate].numRateSuccess++; |
608 station->m_minstrelTable[station->m_txrate].numRateAttempt++; | 588 station->m_minstrelTable[station->m_txrate].numRateAttempt++; |
609 | 589 |
610 m_legacyManager->UpdatePacketCounters (station); | 590 m_legacyManager->UpdatePacketCounters (station); |
| 591 |
| 592 NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", atte
mpt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", succ
ess = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (afte
r update)."); |
611 | 593 |
612 UpdateRetry (station); | 594 UpdateRetry (station); |
613 m_legacyManager->UpdateStats (station); | 595 m_legacyManager->UpdateStats (station); |
614 | 596 |
615 if (station->m_nModes >= 1) | 597 if (station->m_nModes >= 1) |
616 { | 598 { |
617 station->m_txrate = m_legacyManager->FindRate (station); | 599 station->m_txrate = m_legacyManager->FindRate (station); |
618 } | 600 } |
619 } | 601 } |
620 else | 602 else |
621 { | 603 { |
622 uint32_t rateId = GetRateId (station->m_txrate); | 604 uint32_t rateId = GetRateId (station->m_txrate); |
623 uint32_t groupId = GetGroupId (station->m_txrate); | 605 uint32_t groupId = GetGroupId (station->m_txrate); |
624 station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess++; | 606 station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess++; |
625 station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++; | 607 station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++; |
626 | 608 |
627 UpdatePacketCounters (station, 1, 0); | 609 UpdatePacketCounters (station, 1, 0); |
| 610 |
| 611 NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", atte
mpt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", succ
ess = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (afte
r update)."); |
628 | 612 |
629 station->m_isSampling = false; | 613 station->m_isSampling = false; |
630 station->m_sampleDeferred = false; | 614 station->m_sampleDeferred = false; |
631 | 615 |
632 UpdateRetry (station); | 616 UpdateRetry (station); |
633 if (Simulator::Now () >= station->m_nextStatsUpdate) | 617 if (Simulator::Now () >= station->m_nextStatsUpdate) |
634 { | 618 { |
635 UpdateStats (station); | 619 UpdateStats (station); |
636 } | 620 } |
637 | 621 |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 } | 829 } |
846 NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate); | 830 NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate); |
847 } | 831 } |
848 | 832 |
849 void | 833 void |
850 MinstrelHtWifiManager::UpdateRetry (MinstrelHtWifiRemoteStation *station) | 834 MinstrelHtWifiManager::UpdateRetry (MinstrelHtWifiRemoteStation *station) |
851 { | 835 { |
852 NS_LOG_FUNCTION (this << station); | 836 NS_LOG_FUNCTION (this << station); |
853 station->m_shortRetry = 0; | 837 station->m_shortRetry = 0; |
854 station->m_longRetry = 0; | 838 station->m_longRetry = 0; |
855 | |
856 } | 839 } |
857 | 840 |
858 void | 841 void |
859 MinstrelHtWifiManager::UpdatePacketCounters (MinstrelHtWifiRemoteStation *statio
n, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus) | 842 MinstrelHtWifiManager::UpdatePacketCounters (MinstrelHtWifiRemoteStation *statio
n, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus) |
860 { | 843 { |
861 NS_LOG_FUNCTION (this << station << static_cast<uint16_t> (nSuccessfulMpdus) <
< static_cast<uint16_t> (nFailedMpdus)); | 844 NS_LOG_FUNCTION (this << station << static_cast<uint16_t> (nSuccessfulMpdus) <
< static_cast<uint16_t> (nFailedMpdus)); |
862 | 845 |
863 station->m_totalPacketsCount += nSuccessfulMpdus + nFailedMpdus; | 846 station->m_totalPacketsCount += nSuccessfulMpdus + nFailedMpdus; |
864 if (station->m_isSampling) | 847 if (station->m_isSampling) |
865 { | 848 { |
866 station->m_samplePacketsCount += nSuccessfulMpdus + nFailedMpdus; | 849 station->m_samplePacketsCount += nSuccessfulMpdus + nFailedMpdus; |
867 } | 850 } |
868 if (station->m_totalPacketsCount == ~0) | 851 if (station->m_totalPacketsCount == ~0) |
869 { | 852 { |
870 station->m_samplePacketsCount = 0; | 853 station->m_samplePacketsCount = 0; |
871 station->m_totalPacketsCount = 0; | 854 station->m_totalPacketsCount = 0; |
872 } | 855 } |
873 | 856 |
874 if (!station->m_sampleWait && !station->m_sampleTries && station->m_sampleCoun
t > 0) | 857 if (!station->m_sampleWait && !station->m_sampleTries && station->m_sampleCoun
t > 0) |
875 { | 858 { |
876 station->m_sampleWait = static_cast<uint32_t>(16 + 2 * station->m_avgAmpdu
Len); | 859 station->m_sampleWait = static_cast<uint32_t>(16 + 2 * station->m_avgAmpdu
Len); |
877 station->m_sampleTries = 1; | 860 station->m_sampleTries = 1; |
878 station->m_sampleCount--; | 861 station->m_sampleCount--; |
879 } | 862 } |
880 | 863 } |
881 } | 864 |
882 void | 865 void |
883 MinstrelHtWifiManager::DoDisposeStation (WifiRemoteStation *st) | 866 MinstrelHtWifiManager::DoDisposeStation (WifiRemoteStation *st) |
884 { | 867 { |
885 NS_LOG_FUNCTION (this << st); | 868 NS_LOG_FUNCTION (this << st); |
886 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *) st; | 869 MinstrelHtWifiRemoteStation *station = (MinstrelHtWifiRemoteStation *) st; |
887 station->DisposeStation (); | 870 station->DisposeStation (); |
888 } | 871 } |
889 | 872 |
890 WifiTxVector | 873 WifiTxVector |
891 MinstrelHtWifiManager::DoGetDataTxVector (WifiRemoteStation *st) | 874 MinstrelHtWifiManager::DoGetDataTxVector (WifiRemoteStation *st) |
(...skipping 17 matching lines...) Expand all Loading... |
909 } | 892 } |
910 | 893 |
911 return vector; | 894 return vector; |
912 } | 895 } |
913 else | 896 else |
914 { | 897 { |
915 NS_LOG_DEBUG ("DoGetDataMode m_txrate= " << station->m_txrate); | 898 NS_LOG_DEBUG ("DoGetDataMode m_txrate= " << station->m_txrate); |
916 | 899 |
917 uint32_t rateId = GetRateId (station->m_txrate); | 900 uint32_t rateId = GetRateId (station->m_txrate); |
918 uint32_t groupId = GetGroupId (station->m_txrate); | 901 uint32_t groupId = GetGroupId (station->m_txrate); |
919 uint32_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].m
csIndex; | 902 uint8_t mcsIndex = static_cast<uint8_t> (station->m_groupsTable[groupId].m
_ratesTable[rateId].mcsIndex); |
920 | 903 |
921 NS_LOG_DEBUG ("DoGetDataMode rateId= " << rateId << " groupId= " << groupI
d << " mode= " << GetMcsSupported (station, mcsIndex)); | 904 NS_LOG_DEBUG ("DoGetDataMode rateId= " << rateId << " groupId= " << groupI
d << " mode= " << GetMcsSupported (station, mcsIndex)); |
922 | 905 |
923 McsGroup group = m_minstrelGroups[groupId]; | 906 McsGroup group = m_minstrelGroups[groupId]; |
924 | 907 |
925 // Check consistency of rate selected. | 908 // Check consistency of rate selected. |
926 if ((group.sgi && !GetShortGuardInterval (station)) || group.chWidth > Get
ChannelWidth (station) || group.streams > GetNumberOfSupportedStreams (station
)) | 909 if ((group.sgi && !GetShortGuardInterval (station)) || group.chWidth > Get
ChannelWidth (station) || group.streams > GetNumberOfSupportedStreams (station
)) |
927 { | 910 { |
928 NS_ASSERT_MSG (false, "Inconsistent group selected. Group: (" << stati
c_cast<uint16_t> (group.streams) << | 911 NS_ASSERT_MSG (false, "Inconsistent group selected. Group: (" << stati
c_cast<uint16_t> (group.streams) << |
929 "," << static_cast<uint16_t> (group.sgi) << "," << stat
ic_cast<uint16_t> (group.chWidth) << ")" << | 912 "," << static_cast<uint16_t> (group.sgi) << "," << stat
ic_cast<uint16_t> (group.chWidth) << ")" << |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
970 * directed to the same receiving STA. If no rate in the BSSBasicRateSet p
arameter meets | 953 * directed to the same receiving STA. If no rate in the BSSBasicRateSet p
arameter meets |
971 * these conditions, the control frame shall be transmitted at a rate no h
igher than the | 954 * these conditions, the control frame shall be transmitted at a rate no h
igher than the |
972 * highest mandatory rate of the attached PHY that is less than or equal t
o the rate | 955 * highest mandatory rate of the attached PHY that is less than or equal t
o the rate |
973 * or non-HT reference rate (see 9.7.9) of the previously transmitted fram
e that was | 956 * or non-HT reference rate (see 9.7.9) of the previously transmitted fram
e that was |
974 * directed to the same receiving STA." | 957 * directed to the same receiving STA." |
975 */ | 958 */ |
976 | 959 |
977 // As we are in Minstrel HT, assume the last rate was an HT rate. | 960 // As we are in Minstrel HT, assume the last rate was an HT rate. |
978 uint32_t rateId = GetRateId (station->m_txrate); | 961 uint32_t rateId = GetRateId (station->m_txrate); |
979 uint32_t groupId = GetGroupId (station->m_txrate); | 962 uint32_t groupId = GetGroupId (station->m_txrate); |
980 uint32_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].m
csIndex; | 963 uint8_t mcsIndex = static_cast<uint8_t> (station->m_groupsTable[groupId].m
_ratesTable[rateId].mcsIndex); |
981 | 964 |
982 WifiMode lastRate = GetMcsSupported (station, mcsIndex); | 965 WifiMode lastRate = GetMcsSupported (station, mcsIndex); |
983 uint64_t lastDataRate = lastRate.GetNonHtReferenceRate (); | 966 uint64_t lastDataRate = lastRate.GetNonHtReferenceRate (); |
984 uint8_t nBasicRates = GetNBasicModes (); | 967 uint8_t nBasicRates = GetNBasicModes (); |
985 | 968 |
986 WifiMode rtsRate; | 969 WifiMode rtsRate; |
987 bool rateFound = false; | 970 bool rateFound = false; |
988 | 971 |
989 for (uint8_t i = 0; i < nBasicRates; i++) | 972 for (uint8_t i = 0; i < nBasicRates; i++) |
990 { | 973 { |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1278 station->m_groupsTable[j].m_maxTpRate = GetLowestIndex (station, j); | 1261 station->m_groupsTable[j].m_maxTpRate = GetLowestIndex (station, j); |
1279 station->m_groupsTable[j].m_maxTpRate2 = GetLowestIndex (station, j); | 1262 station->m_groupsTable[j].m_maxTpRate2 = GetLowestIndex (station, j); |
1280 station->m_groupsTable[j].m_maxProbRate = GetLowestIndex (station, j); | 1263 station->m_groupsTable[j].m_maxProbRate = GetLowestIndex (station, j); |
1281 | 1264 |
1282 for (uint8_t i = 0; i < m_numRates; i++) | 1265 for (uint8_t i = 0; i < m_numRates; i++) |
1283 { | 1266 { |
1284 if (station->m_groupsTable[j].m_ratesTable[i].supported) | 1267 if (station->m_groupsTable[j].m_ratesTable[i].supported) |
1285 { | 1268 { |
1286 station->m_groupsTable[j].m_ratesTable[i].retryUpdated = false
; | 1269 station->m_groupsTable[j].m_ratesTable[i].retryUpdated = false
; |
1287 | 1270 |
1288 NS_LOG_DEBUG (i << " " << GetMcsSupported (station, station->
m_groupsTable[j].m_ratesTable[i].mcsIndex) << | 1271 NS_LOG_DEBUG (i << " " << GetMcsSupported (station, static_cas
t<uint8_t> (station->m_groupsTable[j].m_ratesTable[i].mcsIndex)) << |
1289 "\t attempt=" << station->m_groupsTable[j].m_rat
esTable[i].numRateAttempt << | 1272 "\t attempt=" << station->m_groupsTable[j].m_rat
esTable[i].numRateAttempt << |
1290 "\t success=" << station->m_groupsTable[j].m_rat
esTable[i].numRateSuccess); | 1273 "\t success=" << station->m_groupsTable[j].m_rat
esTable[i].numRateSuccess); |
1291 | 1274 |
1292 /// If we've attempted something. | 1275 /// If we've attempted something. |
1293 if (station->m_groupsTable[j].m_ratesTable[i].numRateAttempt >
0) | 1276 if (station->m_groupsTable[j].m_ratesTable[i].numRateAttempt >
0) |
1294 { | 1277 { |
1295 station->m_groupsTable[j].m_ratesTable[i].numSamplesSkippe
d = 0; | 1278 station->m_groupsTable[j].m_ratesTable[i].numSamplesSkippe
d = 0; |
1296 /** | 1279 /** |
1297 * Calculate the probability of success. | 1280 * Calculate the probability of success. |
1298 * Assume probability scales from 0 to 100. | 1281 * Assume probability scales from 0 to 100. |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1617 | 1600 |
1618 if (station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb < 1) | 1601 if (station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb < 1) |
1619 { | 1602 { |
1620 station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 1; | 1603 station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 1; |
1621 } | 1604 } |
1622 else | 1605 else |
1623 { | 1606 { |
1624 station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 2; | 1607 station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 2; |
1625 station->m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated = true; | 1608 station->m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated = true; |
1626 | 1609 |
1627 dataTxTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, statio
n->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex)) + | 1610 dataTxTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, static
_cast<uint8_t> (station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex)))
+ |
1628 GetMpduTxTime (groupId, GetMcsSupported (station, station->m_groupsTable
[groupId].m_ratesTable[rateId].mcsIndex)) * static_cast<uint32_t>(station->m_avg
AmpduLen - 1); | 1611 GetMpduTxTime (groupId, GetMcsSupported (station, static_cast<uint8_t> (
station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex))) * static_cast<u
int32_t>(station->m_avgAmpduLen - 1); |
1629 | 1612 |
1630 /* Contention time for first 2 tries */ | 1613 /* Contention time for first 2 tries */ |
1631 cwTime = (cw / 2) * slotTime; | 1614 cwTime = (cw / 2) * slotTime; |
1632 cw = Min ((cw + 1) * 2, cwMax); | 1615 cw = Min ((cw + 1) * 2, cwMax); |
1633 cwTime += (cw / 2) * slotTime; | 1616 cwTime += (cw / 2) * slotTime; |
1634 cw = Min ((cw + 1) * 2, cwMax); | 1617 cw = Min ((cw + 1) * 2, cwMax); |
1635 | 1618 |
1636 /* Total TX time for data and Contention after first 2 tries */ | 1619 /* Total TX time for data and Contention after first 2 tries */ |
1637 txTime = cwTime + 2 * (dataTxTime + ackTime); | 1620 txTime = cwTime + 2 * (dataTxTime + ackTime); |
1638 | 1621 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1781 of << std::setw (4) << " MCS" << (group.streams - 1) * 8 + i; | 1764 of << std::setw (4) << " MCS" << (group.streams - 1) * 8 + i; |
1782 } | 1765 } |
1783 else | 1766 else |
1784 { | 1767 { |
1785 of << std::setw (7) << " MCS" << i << "/" << (int) group.streams
; | 1768 of << std::setw (7) << " MCS" << i << "/" << (int) group.streams
; |
1786 } | 1769 } |
1787 | 1770 |
1788 of << " " << std::setw (3) << idx << " "; | 1771 of << " " << std::setw (3) << idx << " "; |
1789 | 1772 |
1790 /* tx_time[rate(i)] in usec */ | 1773 /* tx_time[rate(i)] in usec */ |
1791 txTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, statio
n->m_groupsTable[groupId].m_ratesTable[i].mcsIndex)); | 1774 txTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, static
_cast<uint8_t> (station->m_groupsTable[groupId].m_ratesTable[i].mcsIndex))); |
1792 of << std::setw (6) << txTime.GetMicroSeconds () << " "; | 1775 of << std::setw (6) << txTime.GetMicroSeconds () << " "; |
1793 | 1776 |
1794 of << std::setw (7) << CalculateThroughput (station, groupId, i, 100)
/ 100 << " " << | 1777 of << std::setw (7) << CalculateThroughput (station, groupId, i, 100)
/ 100 << " " << |
1795 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].thr
oughput / 100 << " " << | 1778 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].thr
oughput / 100 << " " << |
1796 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewm
aProb << " " << | 1779 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewm
aProb << " " << |
1797 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewm
sdProb << " " << | 1780 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewm
sdProb << " " << |
1798 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].pro
b << " " << | 1781 std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].pro
b << " " << |
1799 std::setw (2) << station->m_groupsTable[groupId].m_ratesTable[i].ret
ryCount << " " << | 1782 std::setw (2) << station->m_groupsTable[groupId].m_ratesTable[i].ret
ryCount << " " << |
1800 std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].pre
vNumRateSuccess << " " << | 1783 std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].pre
vNumRateSuccess << " " << |
1801 std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].pre
vNumRateAttempt << " " << | 1784 std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].pre
vNumRateAttempt << " " << |
1802 std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].suc
cessHist << " " << | 1785 std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].suc
cessHist << " " << |
1803 std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].att
emptHist << "\n"; | 1786 std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].att
emptHist << "\n"; |
1804 } | 1787 } |
1805 } | 1788 } |
1806 } | 1789 } |
1807 uint32_t | 1790 uint32_t |
1808 MinstrelHtWifiManager::GetIndex (uint32_t groupId, uint32_t rateId) | 1791 MinstrelHtWifiManager::GetIndex (uint32_t groupId, uint32_t rateId) |
1809 { | 1792 { |
1810 NS_LOG_FUNCTION (this << groupId << rateId); | 1793 NS_LOG_FUNCTION (this << groupId << rateId); |
1811 uint32_t index; | 1794 uint32_t index; |
1812 index = groupId * m_numRates + rateId; | 1795 index = groupId * m_numRates + rateId; |
1813 return index; | 1796 return index; |
1814 } | 1797 } |
1815 | 1798 |
1816 uint32_t | 1799 uint32_t |
1817 MinstrelHtWifiManager::GetRateId (uint32_t index) | 1800 MinstrelHtWifiManager::GetRateId (uint32_t index) |
1818 { | 1801 { |
1819 NS_LOG_FUNCTION (this << index); | 1802 NS_LOG_FUNCTION (this << index); |
1820 | |
1821 uint32_t id; | 1803 uint32_t id; |
1822 id = index % m_numRates; | 1804 id = index % m_numRates; |
1823 return id; | 1805 return id; |
1824 } | 1806 } |
1825 | 1807 |
1826 uint32_t | 1808 uint32_t |
1827 MinstrelHtWifiManager::GetGroupId (uint32_t index) | 1809 MinstrelHtWifiManager::GetGroupId (uint32_t index) |
1828 { | 1810 { |
1829 NS_LOG_FUNCTION (this << index); | 1811 NS_LOG_FUNCTION (this << index); |
1830 | |
1831 return index / m_numRates; | 1812 return index / m_numRates; |
1832 } | 1813 } |
1833 | 1814 |
1834 uint32_t | 1815 uint32_t |
1835 MinstrelHtWifiManager::GetHtGroupId (uint8_t txstreams, uint8_t sgi, uint8_t chW
idth) | 1816 MinstrelHtWifiManager::GetHtGroupId (uint8_t txstreams, uint8_t sgi, uint8_t chW
idth) |
1836 { | 1817 { |
1837 NS_LOG_FUNCTION (this << static_cast<uint16_t> (txstreams) << static_cast<uint
16_t> (sgi) << static_cast<uint16_t> (chWidth)); | 1818 NS_LOG_FUNCTION (this << static_cast<uint16_t> (txstreams) << static_cast<uint
16_t> (sgi) << static_cast<uint16_t> (chWidth)); |
1838 return MAX_SUPPORTED_STREAMS * 2 * (chWidth == 40 ? 1 : 0) + MAX_SUPPORTED_STR
EAMS * sgi + txstreams - 1; | 1819 return MAX_SUPPORTED_STREAMS * 2 * (chWidth == 40 ? 1 : 0) + MAX_SUPPORTED_STR
EAMS * sgi + txstreams - 1; |
1839 } | 1820 } |
1840 | 1821 |
(...skipping 30 matching lines...) Expand all Loading... |
1871 | 1852 |
1872 uint32_t rateId = 0; | 1853 uint32_t rateId = 0; |
1873 while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[ra
teId].supported) | 1854 while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[ra
teId].supported) |
1874 { | 1855 { |
1875 rateId++; | 1856 rateId++; |
1876 } | 1857 } |
1877 NS_ASSERT (station->m_groupsTable[groupId].m_supported && station->m_groupsTab
le[groupId].m_ratesTable[rateId].supported); | 1858 NS_ASSERT (station->m_groupsTable[groupId].m_supported && station->m_groupsTab
le[groupId].m_ratesTable[rateId].supported); |
1878 return GetIndex (groupId, rateId); | 1859 return GetIndex (groupId, rateId); |
1879 } | 1860 } |
1880 | 1861 |
1881 | |
1882 WifiModeList | 1862 WifiModeList |
1883 MinstrelHtWifiManager::GetVhtDeviceMcsList (void) const | 1863 MinstrelHtWifiManager::GetVhtDeviceMcsList (void) const |
1884 { | 1864 { |
1885 WifiModeList vhtMcsList; | 1865 WifiModeList vhtMcsList; |
1886 Ptr<WifiPhy> phy = GetPhy (); | 1866 Ptr<WifiPhy> phy = GetPhy (); |
1887 for (uint8_t i = 0; i < phy->GetNMcs (); i++) | 1867 for (uint8_t i = 0; i < phy->GetNMcs (); i++) |
1888 { | 1868 { |
1889 WifiMode mode = phy->GetMcs (i); | 1869 WifiMode mode = phy->GetMcs (i); |
1890 if (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT) | 1870 if (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT) |
1891 { | 1871 { |
(...skipping 23 matching lines...) Expand all Loading... |
1915 MinstrelHtWifiManager::SetHeSupported (bool enable) | 1895 MinstrelHtWifiManager::SetHeSupported (bool enable) |
1916 { | 1896 { |
1917 //HE is not supported yet by this algorithm. | 1897 //HE is not supported yet by this algorithm. |
1918 if (enable) | 1898 if (enable) |
1919 { | 1899 { |
1920 NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rat
es"); | 1900 NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rat
es"); |
1921 } | 1901 } |
1922 } | 1902 } |
1923 | 1903 |
1924 } // namespace ns3 | 1904 } // namespace ns3 |
1925 | |
1926 | |
1927 | |
1928 | |
1929 | |
LEFT | RIGHT |