|
|
| 657 |
WifiMacHeader header; |
657 |
WifiMacHeader header; |
| 658 |
if (m_currentPacket == 0) |
658 |
if (m_currentPacket == 0) |
| 659 |
{ |
659 |
{ |
| 660 |
packet = m_queue->Peek (&header); |
660 |
if (m_baManager->HasPackets ()) |
| 661 |
NS_ASSERT_MSG (packet, "Internal collision but no packet in queue"); |
661 |
{ |
|
|
662 |
packet = m_baManager->PeekNextPacket (header); |
| 663 |
} |
| 664 |
else |
| 665 |
{ |
| 666 |
packet = m_queue->Peek (&header); |
| 667 |
} |
| 662 |
} |
668 |
} |
| 663 |
else |
669 |
else |
| 664 |
{ |
670 |
{ |
| 665 |
packet = m_currentPacket; |
671 |
packet = m_currentPacket; |
| 666 |
header = m_currentHdr; |
672 |
header = m_currentHdr; |
| 667 |
} |
673 |
} |
| 668 |
if (m_isAccessRequestedForRts) |
674 |
if (packet != 0) |
| 669 |
{ |
|
|
| 670 |
if (!NeedRtsRetransmission (packet, header)) |
| 671 |
{ |
| 672 |
resetDcf = true; |
| 673 |
m_stationManager->ReportFinalRtsFailed (header.GetAddr1 (), &header); |
| 674 |
} |
| 675 |
else |
| 676 |
{ |
| 677 |
m_stationManager->ReportRtsFailed (header.GetAddr1 (), &header); |
| 678 |
} |
| 679 |
} |
| 680 |
else if (header.GetAddr1 () == Mac48Address::GetBroadcast ()) |
| 681 |
{ |
| 682 |
resetDcf = false; |
| 683 |
} |
| 684 |
else |
| 685 |
{ |
675 |
{ |
| 686 |
if (!NeedDataRetransmission (packet, header)) |
676 |
if (m_isAccessRequestedForRts) |
| 687 |
{ |
|
|
| 688 |
resetDcf = true; |
| 689 |
m_stationManager->ReportFinalDataFailed (header.GetAddr1 (), &header); |
| 690 |
} |
| 691 |
else |
| 692 |
{ |
| 693 |
m_stationManager->ReportDataFailed (header.GetAddr1 (), &header); |
| 694 |
} |
| 695 |
} |
| 696 |
if (resetDcf) |
| 697 |
{ |
| 698 |
NS_LOG_DEBUG ("reset DCF"); |
| 699 |
if (!m_txFailedCallback.IsNull ()) |
| 700 |
{ |
677 |
{ |
| 701 |
m_txFailedCallback (header); |
678 |
if (!NeedRtsRetransmission (packet, header)) |
|
|
679 |
{ |
| 680 |
resetDcf = true; |
| 681 |
m_stationManager->ReportFinalRtsFailed (header.GetAddr1 (), &header); |
| 682 |
} |
| 683 |
else |
| 684 |
{ |
| 685 |
m_stationManager->ReportRtsFailed (header.GetAddr1 (), &header); |
| 686 |
} |
| 702 |
} |
687 |
} |
| 703 |
//to reset the dcf. |
688 |
else if (header.GetAddr1 () == Mac48Address::GetBroadcast ()) |
| 704 |
if (m_currentPacket) |
|
|
| 705 |
{ |
689 |
{ |
| 706 |
NS_LOG_DEBUG ("Discarding m_currentPacket"); |
690 |
resetDcf = false; |
| 707 |
m_currentPacket = 0; |
|
|
| 708 |
} |
691 |
} |
| 709 |
else |
692 |
else |
| 710 |
{ |
693 |
{ |
| 711 |
NS_LOG_DEBUG ("Dequeueing and discarding head of queue"); |
694 |
if (!NeedDataRetransmission (packet, header)) |
| 712 |
packet = m_queue->Peek (&header); |
695 |
{ |
|
|
696 |
resetDcf = true; |
| 697 |
m_stationManager->ReportFinalDataFailed (header.GetAddr1 (), &header); |
| 698 |
} |
| 699 |
else |
| 700 |
{ |
| 701 |
m_stationManager->ReportDataFailed (header.GetAddr1 (), &header); |
| 702 |
} |
| 713 |
} |
703 |
} |
| 714 |
m_dcf->ResetCw (); |
704 |
if (resetDcf) |
| 715 |
} |
705 |
{ |
| 716 |
else |
706 |
NS_LOG_DEBUG ("reset DCF"); |
| 717 |
{ |
707 |
if (!m_txFailedCallback.IsNull ()) |
| 718 |
m_dcf->UpdateFailedCw (); |
708 |
{ |
|
|
709 |
m_txFailedCallback (header); |
| 710 |
} |
| 711 |
//to reset the dcf. |
| 712 |
if (m_currentPacket) |
| 713 |
{ |
| 714 |
NS_LOG_DEBUG ("Discarding m_currentPacket"); |
| 715 |
m_currentPacket = 0; |
| 716 |
} |
| 717 |
else |
| 718 |
{ |
| 719 |
NS_LOG_DEBUG ("Dequeueing and discarding head of queue"); |
| 720 |
packet = m_queue->Peek (&header); |
| 721 |
} |
| 722 |
m_dcf->ResetCw (); |
| 723 |
} |
| 724 |
else |
| 725 |
{ |
| 726 |
m_dcf->UpdateFailedCw (); |
| 727 |
} |
| 719 |
} |
728 |
} |
| 720 |
m_backoffTrace = m_rng->GetNext (0, m_dcf->GetCw ()); |
729 |
m_backoffTrace = m_rng->GetNext (0, m_dcf->GetCw ()); |
| 721 |
m_dcf->StartBackoffNow (m_backoffTrace); |
730 |
m_dcf->StartBackoffNow (m_backoffTrace); |