|
|
| 531 |
MacLow::ResetPhy (void) |
531 |
MacLow::ResetPhy (void) |
| 532 |
{ |
532 |
{ |
| 533 |
m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> ()); |
533 |
m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> ()); |
| 534 |
m_phy->SetReceiveErrorCallback (MakeNullCallback<void, Ptr<const Packet>, double> ()); |
534 |
m_phy->SetReceiveErrorCallback (MakeNullCallback<void, Ptr<const Packet>, double, bool> ()); |
| 535 |
RemovePhyMacLowListener (m_phy); |
535 |
RemovePhyMacLowListener (m_phy); |
| 536 |
m_phy = 0; |
536 |
m_phy = 0; |
| 537 |
} |
537 |
} |
|
|
| 818 |
} |
818 |
} |
| 819 |
|
819 |
|
| 820 |
void |
820 |
void |
| 821 |
MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr) |
821 |
MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr, bool isEndOfFrame) |
| 822 |
{ |
822 |
{ |
| 823 |
NS_LOG_FUNCTION (this << packet << rxSnr); |
823 |
NS_LOG_FUNCTION (this << packet << rxSnr << isEndOfFrame); |
| 824 |
NS_LOG_DEBUG ("rx failed "); |
824 |
NS_LOG_DEBUG ("rx failed "); |
| 825 |
AmpduTag ampdu; |
825 |
if (isEndOfFrame == true && m_receivedAtLeastOneMpdu == true) |
| 826 |
Ptr<Packet> pkt = packet->Copy (); |
|
|
| 827 |
bool isInAmpdu = pkt->RemovePacketTag (ampdu); |
| 828 |
|
| 829 |
if (isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus () == 1)) |
| 830 |
{ |
826 |
{ |
| 831 |
MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (pkt); |
827 |
NS_ASSERT (m_lastReceivedHdr.IsQosData ()); |
| 832 |
MpduAggregator::DeaggregatedMpdusCI n = packets.begin (); |
828 |
NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << m_lastReceivedHdr.GetAddr2 ()); |
| 833 |
WifiMacHeader hdr; |
829 |
m_sendAckEvent = Simulator::Schedule (GetSifs (), |
| 834 |
(*n).first->PeekHeader (hdr); |
830 |
&MacLow::SendBlockAckAfterAmpdu, this, |
| 835 |
if (hdr.IsQosData ()) |
831 |
m_lastReceivedHdr.GetQosTid (), |
| 836 |
{ |
832 |
m_lastReceivedHdr.GetAddr2 (), |
| 837 |
uint8_t tid = hdr.GetQosTid (); |
833 |
m_lastReceivedHdr.GetDuration (), |
| 838 |
AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), tid)); |
834 |
m_currentTxVector); |
| 839 |
if (it != m_bAckAgreements.end ()) |
835 |
m_receivedAtLeastOneMpdu = false; |
| 840 |
{ |
|
|
| 841 |
NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ()); |
| 842 |
m_sendAckEvent = Simulator::Schedule (GetSifs (), |
| 843 |
&MacLow::SendBlockAckAfterAmpdu, this, |
| 844 |
hdr.GetQosTid (), |
| 845 |
hdr.GetAddr2 (), |
| 846 |
hdr.GetDuration (), |
| 847 |
m_currentTxVector); |
| 848 |
m_receivedAtLeastOneMpdu = false; |
| 849 |
} |
| 850 |
} |
| 851 |
else if (hdr.IsBlockAckReq ()) |
| 852 |
{ |
| 853 |
NS_LOG_DEBUG ("last a-mpdu subframe is BAR"); |
| 854 |
m_receivedAtLeastOneMpdu = false; |
| 855 |
} |
| 856 |
} |
836 |
} |
| 857 |
else if (m_txParams.MustWaitFastAck ()) |
837 |
if (m_txParams.MustWaitFastAck ()) |
| 858 |
{ |
838 |
{ |
| 859 |
NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ()); |
839 |
NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ()); |
| 860 |
m_fastAckFailedTimeoutEvent = Simulator::Schedule (GetSifs (), |
840 |
m_fastAckFailedTimeoutEvent = Simulator::Schedule (GetSifs (), |
|
|
| 905 |
*/ |
885 |
*/ |
| 906 |
WifiMacHeader hdr; |
886 |
WifiMacHeader hdr; |
| 907 |
packet->RemoveHeader (hdr); |
887 |
packet->RemoveHeader (hdr); |
|
|
888 |
m_lastReceivedHdr = hdr; |
| 908 |
|
889 |
|
| 909 |
bool isPrevNavZero = IsNavZero (); |
890 |
bool isPrevNavZero = IsNavZero (); |
| 910 |
NS_LOG_DEBUG ("duration/id=" << hdr.GetDuration ()); |
891 |
NS_LOG_DEBUG ("duration/id=" << hdr.GetDuration ()); |