|
258 |
m_msduAggregator (0), |
258 |
m_msduAggregator (0), |
259 |
m_mpduAggregator (0), |
259 |
m_mpduAggregator (0), |
260 |
m_typeOfStation (STA), |
260 |
m_typeOfStation (STA), |
261 |
m_blockAckType (COMPRESSED_BLOCK_ACK) |
261 |
m_blockAckType (COMPRESSED_BLOCK_ACK), |
|
|
262 |
m_isAccessRequestedForRts (false) |
262 |
{ |
263 |
{ |
263 |
NS_LOG_FUNCTION (this); |
264 |
NS_LOG_FUNCTION (this); |
264 |
m_transmissionListener = new EdcaTxopN::TransmissionListener (this); |
265 |
m_transmissionListener = new EdcaTxopN::TransmissionListener (this); |
|
464 |
Ptr<const Packet> |
465 |
Ptr<const Packet> |
465 |
EdcaTxopN::PeekNextRetransmitPacket (WifiMacHeader &header,Mac48Address recipient, uint8_t tid, Time *timestamp) |
466 |
EdcaTxopN::PeekNextRetransmitPacket (WifiMacHeader &header,Mac48Address recipient, uint8_t tid, Time *timestamp) |
466 |
{ |
467 |
{ |
467 |
return m_baManager->PeekNextPacket (header,recipient,tid, timestamp); |
468 |
return m_baManager->PeekNextPacketByTidAndAddress (header,recipient,tid, timestamp); |
468 |
} |
469 |
} |
469 |
|
470 |
|
470 |
void |
471 |
void |
|
477 |
EdcaTxopN::NotifyAccessGranted (void) |
478 |
EdcaTxopN::NotifyAccessGranted (void) |
478 |
{ |
479 |
{ |
479 |
NS_LOG_FUNCTION (this); |
480 |
NS_LOG_FUNCTION (this); |
|
|
481 |
m_isAccessRequestedForRts = false; |
480 |
if (m_currentPacket == 0) |
482 |
if (m_currentPacket == 0) |
481 |
{ |
483 |
{ |
482 |
if (m_queue->IsEmpty () && !m_baManager->HasPackets ()) |
484 |
if (m_queue->IsEmpty () && !m_baManager->HasPackets ()) |
|
633 |
void EdcaTxopN::NotifyInternalCollision (void) |
635 |
void EdcaTxopN::NotifyInternalCollision (void) |
634 |
{ |
636 |
{ |
635 |
NS_LOG_FUNCTION (this); |
637 |
NS_LOG_FUNCTION (this); |
636 |
NotifyCollision (); |
638 |
bool resetDcf = false; |
|
|
639 |
if (m_isAccessRequestedForRts) |
640 |
{ |
641 |
if (!NeedRtsRetransmission ()) |
642 |
{ |
643 |
resetDcf = true; |
644 |
m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
645 |
} |
646 |
else |
647 |
{ |
648 |
m_stationManager->ReportRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
649 |
} |
650 |
} |
651 |
else |
652 |
{ |
653 |
if (!NeedDataRetransmission ()) |
654 |
{ |
655 |
resetDcf = true; |
656 |
m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
657 |
} |
658 |
else |
659 |
{ |
660 |
m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr); |
661 |
} |
662 |
} |
663 |
if (resetDcf) |
664 |
{ |
665 |
if (!m_txFailedCallback.IsNull ()) |
666 |
{ |
667 |
m_txFailedCallback (m_currentHdr); |
668 |
} |
669 |
//to reset the dcf. |
670 |
m_currentPacket = 0; |
671 |
m_dcf->ResetCw (); |
672 |
} |
673 |
else |
674 |
{ |
675 |
m_dcf->UpdateFailedCw (); |
676 |
} |
677 |
m_backoffTrace = m_rng->GetNext (0, m_dcf->GetCw ()); |
678 |
m_dcf->StartBackoffNow (m_backoffTrace); |
679 |
RestartAccessIfNeeded (); |
637 |
} |
680 |
} |
638 |
|
681 |
|
639 |
void |
682 |
void |
|
1024 |
|| !m_queue->IsEmpty () || m_baManager->HasPackets ()) |
1067 |
|| !m_queue->IsEmpty () || m_baManager->HasPackets ()) |
1025 |
&& !m_dcf->IsAccessRequested ()) |
1068 |
&& !m_dcf->IsAccessRequested ()) |
1026 |
{ |
1069 |
{ |
|
|
1070 |
Ptr<const Packet> packet; |
1071 |
WifiMacHeader hdr; |
1072 |
if (m_currentPacket != 0) |
1073 |
{ |
1074 |
packet = m_currentPacket; |
1075 |
hdr = m_currentHdr; |
1076 |
} |
1077 |
else if (m_baManager->HasPackets ()) |
1078 |
{ |
1079 |
packet = m_baManager->PeekNextPacket (hdr); |
1080 |
} |
1081 |
else if (m_queue->PeekFirstAvailable (&hdr, m_currentPacketTimestamp, m_qosBlockedDestinations) != 0) |
1082 |
{ |
1083 |
packet = m_queue->PeekFirstAvailable (&hdr, m_currentPacketTimestamp, m_qosBlockedDestinations); |
1084 |
} |
1085 |
if (packet != 0) |
1086 |
{ |
1087 |
m_isAccessRequestedForRts = m_stationManager->NeedRts (hdr.GetAddr1 (), &hdr, packet, m_low->GetDataTxVector (packet, &hdr)); |
1088 |
} |
1089 |
else |
1090 |
{ |
1091 |
m_isAccessRequestedForRts = false; |
1092 |
} |
1027 |
m_manager->RequestAccess (m_dcf); |
1093 |
m_manager->RequestAccess (m_dcf); |
1028 |
} |
1094 |
} |
1029 |
} |
1095 |
} |
|
1036 |
&& (!m_queue->IsEmpty () || m_baManager->HasPackets ()) |
1102 |
&& (!m_queue->IsEmpty () || m_baManager->HasPackets ()) |
1037 |
&& !m_dcf->IsAccessRequested ()) |
1103 |
&& !m_dcf->IsAccessRequested ()) |
1038 |
{ |
1104 |
{ |
|
|
1105 |
Ptr<const Packet> packet; |
1106 |
WifiMacHeader hdr; |
1107 |
if (m_currentPacket != 0) |
1108 |
{ |
1109 |
packet = m_currentPacket; |
1110 |
hdr = m_currentHdr; |
1111 |
} |
1112 |
else if (m_baManager->HasPackets ()) |
1113 |
{ |
1114 |
packet = m_baManager->PeekNextPacket (hdr); |
1115 |
} |
1116 |
else if (m_queue->PeekFirstAvailable (&hdr, m_currentPacketTimestamp, m_qosBlockedDestinations) != 0) |
1117 |
{ |
1118 |
packet = m_queue->PeekFirstAvailable (&hdr, m_currentPacketTimestamp, m_qosBlockedDestinations); |
1119 |
} |
1120 |
if (packet != 0) |
1121 |
{ |
1122 |
m_isAccessRequestedForRts = m_stationManager->NeedRts (hdr.GetAddr1 (), &hdr, packet, m_low->GetDataTxVector (packet, &hdr)); |
1123 |
} |
1124 |
else |
1125 |
{ |
1126 |
m_isAccessRequestedForRts = false; |
1127 |
} |
1039 |
m_manager->RequestAccess (m_dcf); |
1128 |
m_manager->RequestAccess (m_dcf); |
1040 |
} |
1129 |
} |
1041 |
} |
1130 |
} |