108 |
108 |
109 MacLowTransmissionListener::MacLowTransmissionListener () |
109 MacLowTransmissionListener::MacLowTransmissionListener () |
110 {} |
110 {} |
111 MacLowTransmissionListener::~MacLowTransmissionListener () |
111 MacLowTransmissionListener::~MacLowTransmissionListener () |
112 {} |
112 {} |
113 MacLowNavListener::MacLowNavListener () |
113 MacLowDcfListener::MacLowDcfListener () |
114 {} |
114 {} |
115 MacLowNavListener::~MacLowNavListener () |
115 MacLowDcfListener::~MacLowDcfListener () |
116 {} |
116 {} |
117 |
117 |
118 MacLowTransmissionParameters::MacLowTransmissionParameters () |
118 MacLowTransmissionParameters::MacLowTransmissionParameters () |
119 : m_nextSize (0), |
119 : m_nextSize (0), |
120 m_waitAck (ACK_NONE), |
120 m_waitAck (ACK_NONE), |
421 MacLow::SetRxCallback (Callback<void,Ptr<Packet>,const WifiMacHeader *> callback) |
421 MacLow::SetRxCallback (Callback<void,Ptr<Packet>,const WifiMacHeader *> callback) |
422 { |
422 { |
423 m_rxCallback = callback; |
423 m_rxCallback = callback; |
424 } |
424 } |
425 void |
425 void |
426 MacLow::RegisterNavListener (MacLowNavListener *listener) |
426 MacLow::RegisterDcfListener (MacLowDcfListener *listener) |
427 { |
427 { |
428 m_navListeners.push_back (listener); |
428 m_dcfListeners.push_back (listener); |
429 } |
429 } |
430 |
430 |
431 |
431 |
432 void |
432 void |
433 MacLow::StartTransmission (Ptr<const Packet> packet, |
433 MacLow::StartTransmission (Ptr<const Packet> packet, |
541 WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ()); |
541 WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ()); |
542 station->ReportRxOk (rxSnr, txMode); |
542 station->ReportRxOk (rxSnr, txMode); |
543 station->ReportRtsOk (rxSnr, txMode, tag.Get ()); |
543 station->ReportRtsOk (rxSnr, txMode, tag.Get ()); |
544 |
544 |
545 m_ctsTimeoutEvent.Cancel (); |
545 m_ctsTimeoutEvent.Cancel (); |
|
546 NotifyCtsTimeoutResetNow (); |
546 m_listener->GotCts (rxSnr, txMode); |
547 m_listener->GotCts (rxSnr, txMode); |
547 NS_ASSERT (m_sendDataEvent.IsExpired ()); |
548 NS_ASSERT (m_sendDataEvent.IsExpired ()); |
548 m_sendDataEvent = Simulator::Schedule (GetSifs (), |
549 m_sendDataEvent = Simulator::Schedule (GetSifs (), |
549 &MacLow::SendDataAfterCts, this, |
550 &MacLow::SendDataAfterCts, this, |
550 hdr.GetAddr1 (), |
551 hdr.GetAddr1 (), |
567 bool gotAck = false; |
568 bool gotAck = false; |
568 if (m_txParams.MustWaitNormalAck () && |
569 if (m_txParams.MustWaitNormalAck () && |
569 m_normalAckTimeoutEvent.IsRunning ()) |
570 m_normalAckTimeoutEvent.IsRunning ()) |
570 { |
571 { |
571 m_normalAckTimeoutEvent.Cancel (); |
572 m_normalAckTimeoutEvent.Cancel (); |
|
573 NotifyAckTimeoutResetNow (); |
572 gotAck = true; |
574 gotAck = true; |
573 } |
575 } |
574 if (m_txParams.MustWaitFastAck () && |
576 if (m_txParams.MustWaitFastAck () && |
575 m_fastAckTimeoutEvent.IsRunning ()) |
577 m_fastAckTimeoutEvent.IsRunning ()) |
576 { |
578 { |
577 m_fastAckTimeoutEvent.Cancel (); |
579 m_fastAckTimeoutEvent.Cancel (); |
|
580 NotifyAckTimeoutResetNow (); |
578 gotAck = true; |
581 gotAck = true; |
579 } |
582 } |
580 if (gotAck) |
583 if (gotAck) |
581 { |
584 { |
582 m_listener->GotAck (rxSnr, txMode); |
585 m_listener->GotAck (rxSnr, txMode); |
794 } |
797 } |
795 |
798 |
796 void |
799 void |
797 MacLow::DoNavResetNow (Time duration) |
800 MacLow::DoNavResetNow (Time duration) |
798 { |
801 { |
799 for (NavListenersCI i = m_navListeners.begin (); i != m_navListeners.end (); i++) |
802 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) |
800 { |
803 { |
801 (*i)->NavReset (duration); |
804 (*i)->NavReset (duration); |
802 } |
805 } |
803 m_lastNavStart = Simulator::Now (); |
806 m_lastNavStart = Simulator::Now (); |
804 m_lastNavStart = duration; |
807 m_lastNavStart = duration; |
805 } |
808 } |
806 bool |
809 bool |
807 MacLow::DoNavStartNow (Time duration) |
810 MacLow::DoNavStartNow (Time duration) |
808 { |
811 { |
809 for (NavListenersCI i = m_navListeners.begin (); i != m_navListeners.end (); i++) |
812 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) |
810 { |
813 { |
811 (*i)->NavStart (duration); |
814 (*i)->NavStart (duration); |
812 } |
815 } |
813 Time newNavEnd = Simulator::Now () + duration; |
816 Time newNavEnd = Simulator::Now () + duration; |
814 Time oldNavEnd = m_lastNavStart + m_lastNavDuration; |
817 Time oldNavEnd = m_lastNavStart + m_lastNavDuration; |
817 m_lastNavStart = Simulator::Now (); |
820 m_lastNavStart = Simulator::Now (); |
818 m_lastNavDuration = duration; |
821 m_lastNavDuration = duration; |
819 return true; |
822 return true; |
820 } |
823 } |
821 return false; |
824 return false; |
|
825 } |
|
826 void |
|
827 MacLow::NotifyAckTimeoutStartNow (Time duration) |
|
828 { |
|
829 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) |
|
830 { |
|
831 (*i)->AckTimeoutStart (duration); |
|
832 } |
|
833 } |
|
834 void |
|
835 MacLow::NotifyAckTimeoutResetNow () |
|
836 { |
|
837 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) |
|
838 { |
|
839 (*i)->AckTimeoutReset (); |
|
840 } |
|
841 } |
|
842 void |
|
843 MacLow::NotifyCtsTimeoutStartNow (Time duration) |
|
844 { |
|
845 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) |
|
846 { |
|
847 (*i)->CtsTimeoutStart (duration); |
|
848 } |
|
849 } |
|
850 void |
|
851 MacLow::NotifyCtsTimeoutResetNow () |
|
852 { |
|
853 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) |
|
854 { |
|
855 (*i)->CtsTimeoutReset (); |
|
856 } |
822 } |
857 } |
823 |
858 |
824 void |
859 void |
825 MacLow::ForwardDown (Ptr<const Packet> packet, WifiMacHeader const* hdr, |
860 MacLow::ForwardDown (Ptr<const Packet> packet, WifiMacHeader const* hdr, |
826 WifiMode txMode) |
861 WifiMode txMode) |
943 |
978 |
944 Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxMode, WIFI_PREAMBLE_LONG); |
979 Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxMode, WIFI_PREAMBLE_LONG); |
945 Time timerDelay = txDuration + GetCtsTimeout (); |
980 Time timerDelay = txDuration + GetCtsTimeout (); |
946 |
981 |
947 NS_ASSERT (m_ctsTimeoutEvent.IsExpired ()); |
982 NS_ASSERT (m_ctsTimeoutEvent.IsExpired ()); |
|
983 NotifyCtsTimeoutStartNow (timerDelay); |
948 m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this); |
984 m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this); |
949 |
985 |
950 Ptr<Packet> packet = Create<Packet> (); |
986 Ptr<Packet> packet = Create<Packet> (); |
951 packet->AddHeader (rts); |
987 packet->AddHeader (rts); |
952 WifiMacTrailer fcs; |
988 WifiMacTrailer fcs; |
962 Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxMode, WIFI_PREAMBLE_LONG); |
998 Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxMode, WIFI_PREAMBLE_LONG); |
963 if (m_txParams.MustWaitNormalAck ()) |
999 if (m_txParams.MustWaitNormalAck ()) |
964 { |
1000 { |
965 Time timerDelay = txDuration + GetAckTimeout (); |
1001 Time timerDelay = txDuration + GetAckTimeout (); |
966 NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ()); |
1002 NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ()); |
|
1003 NotifyAckTimeoutStartNow (timerDelay); |
967 m_normalAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::NormalAckTimeout, this); |
1004 m_normalAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::NormalAckTimeout, this); |
968 } |
1005 } |
969 else if (m_txParams.MustWaitFastAck ()) |
1006 else if (m_txParams.MustWaitFastAck ()) |
970 { |
1007 { |
971 Time timerDelay = txDuration + GetPifs (); |
1008 Time timerDelay = txDuration + GetPifs (); |
972 NS_ASSERT (m_fastAckTimeoutEvent.IsExpired ()); |
1009 NS_ASSERT (m_fastAckTimeoutEvent.IsExpired ()); |
|
1010 NotifyAckTimeoutStartNow (timerDelay); |
973 m_fastAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::FastAckTimeout, this); |
1011 m_fastAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::FastAckTimeout, this); |
974 } |
1012 } |
975 else if (m_txParams.MustWaitSuperFastAck ()) |
1013 else if (m_txParams.MustWaitSuperFastAck ()) |
976 { |
1014 { |
977 Time timerDelay = txDuration + GetPifs (); |
1015 Time timerDelay = txDuration + GetPifs (); |
978 NS_ASSERT (m_superFastAckTimeoutEvent.IsExpired ()); |
1016 NS_ASSERT (m_superFastAckTimeoutEvent.IsExpired ()); |
|
1017 NotifyAckTimeoutStartNow (timerDelay); |
979 m_superFastAckTimeoutEvent = Simulator::Schedule (timerDelay, |
1018 m_superFastAckTimeoutEvent = Simulator::Schedule (timerDelay, |
980 &MacLow::SuperFastAckTimeout, this); |
1019 &MacLow::SuperFastAckTimeout, this); |
981 } |
1020 } |
982 else if (m_txParams.HasNextPacket ()) |
1021 else if (m_txParams.HasNextPacket ()) |
983 { |
1022 { |