23 #include "ns3/assert.h"
24 #include "ns3/packet.h"
25 #include "ns3/simulator.h"
29 #include "ns3/double.h"
40 #undef NS_LOG_APPEND_CONTEXT
41 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
79 m_overrideDurationId (Seconds (0))
213 <<
"send rts=" << params.
m_sendRts <<
", "
232 os <<
"basic-block-ack";
235 os <<
"compressed-block-ack";
238 os <<
"multi-tid-block-ack";
286 : m_normalAckTimeoutEvent (),
287 m_fastAckTimeoutEvent (),
288 m_superFastAckTimeoutEvent (),
289 m_fastAckFailedTimeoutEvent (),
290 m_blockAckTimeoutEvent (),
291 m_ctsTimeoutEvent (),
296 m_endTxNoAckEvent (),
345 bool oneRunning =
false;
629 NS_LOG_DEBUG (
"switching channel. Cancelling MAC pending events");
656 NotifyNav (packet,hdr, txMode, preamble);
684 else if (hdr.
IsCts ()
695 rxSnr, txMode, tag.Get ());
707 else if (hdr.
IsAck ()
720 rxSnr, txMode, tag.Get ());
774 if ((*it).second.first.IsImmediateBlockAck ())
791 NS_LOG_DEBUG (
"There's not a valid agreement for this block ack request.");
799 else if (hdr.
IsCtl ())
1055 Time txTime = Seconds (0);
1084 uint32_t dataSize =
GetSize (packet, hdr);
1136 if (hdr.
IsRts () && navUpdated)
1149 Time navCounterResetCtsMissedDelay =
1173 (*i)->NavReset (duration);
1183 (*i)->NavStart (duration);
1187 if (newNavEnd > oldNavEnd)
1190 m_lastNavDuration = duration;
1200 (*i)->AckTimeoutStart (duration);
1208 (*i)->AckTimeoutReset ();
1216 (*i)->CtsTimeoutStart (duration);
1224 (*i)->CtsTimeoutReset ();
1235 ", size=" << packet->
GetSize () <<
1236 ", mode=" << txVector.
GetMode() <<
1330 Time duration = Seconds (0);
1352 dataTxVector, preamble);
1461 Time duration = Seconds (0.0);
1487 dataTxVector, preamble);
1536 Time duration = Seconds (0);
1547 dataTxVector, preamble);
1568 dataTxVector, preamble);
1618 NS_ASSERT (duration >= MicroSeconds (0));
1658 Time newDuration = Seconds (0);
1662 dataTxVector, preamble);
1663 duration -= txDuration;
1666 duration = std::max (duration, newDuration);
1667 NS_ASSERT (duration >= MicroSeconds (0));
1719 NS_ASSERT (duration >= MicroSeconds (0));
1737 ForwardDown (packet, &ack, ackTxVector, preamble);
1750 uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
1754 for (; i != (*it).second.second.end ()
1759 (*it).second.second.insert (i, bufferedPacket);
1764 (*j).second.UpdateWithMpdu (&hdr);
1773 uint16_t startingSeq)
1775 uint8_t tid = respHdr->
GetTid ();
1790 std::list<BufferedPacket> buffer (0);
1835 uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
1837 uint16_t guard = (*it).second.second.begin ()->second.GetSequenceControl () & 0xfff0;
1841 for (; i != (*it).second.second.end ()
1844 if (guard == (*i).second.GetSequenceControl ())
1846 if (!(*i).second.IsMoreFragments ())
1856 while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
1860 if (i != (*it).second.second.end ())
1862 guard = (*i).second.GetSequenceControl () & 0xfff0;
1874 while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
1878 if (i != (*it).second.second.end ())
1880 guard = (*i).second.GetSequenceControl () & 0xfff0;
1885 (*it).second.second.erase ((*it).second.second.begin (), i);
1895 uint16_t startingSeqCtrl = ((*it).second.first.GetStartingSequence () << 4) & 0xfff0;
1896 uint16_t guard = startingSeqCtrl;
1900 for (; i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl (); i++)
1902 if (!(*i).second.IsMoreFragments ())
1904 while (lastComplete != i)
1906 m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
1909 m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
1912 guard = (*i).second.IsMoreFragments () ? (guard + 1) : ((guard + 16) & 0xfff0);
1914 (*it).second.first.SetStartingSequence ((guard >> 4) & 0x0fff);
1917 (*it).second.second.erase ((*it).second.second.begin (), lastComplete);
1939 blockAckReqTxVector.
SetMode(blockAckReqTxMode);
1940 blockAckReqTxVector.
SetNss(1);
1941 blockAckReqTxVector.
SetStbc(
false);
1975 NS_ASSERT (duration >= MicroSeconds (0));
1987 ForwardDown (packet, &hdr, blockAckTxVector,preamble);
1998 bool immediate =
false;
2007 immediate = (*it).second.first.IsImmediateBlockAck ();
2018 (*i).second.FillBlockAckBitmap (&blockAck);
2028 NS_LOG_DEBUG (
"there's not a valid block ack agreement with " << originator);
uint32_t RemoveHeader(Header &header)
bool MustSendRts(void) const
uint32_t GetAckSize(void) const
virtual ~MacLowDcfListener()
uint8_t GetTid(void) const
keep track of time values and allow control of global simulation resolution
EventId m_navCounterResetCtsMissed
#define NS_LOG_FUNCTION(parameters)
void ResetBlockAckInactivityTimerIfNeeded(BlockAckAgreement &agreement)
EventId m_blockAckTimeoutEvent
Time GetBlockAckDuration(Mac48Address to, WifiTxVector blockAckReqTxVector, enum BlockAckType type) const
virtual ~MacLowTransmissionListener()
uint16_t GetTimeout(void) const
Time GetAckDuration(WifiTxVector ackTxVector) const
enum ns3::MacLowTransmissionParameters::@87 m_waitAck
virtual void GotAck(double snr, WifiMode txMode)=0
void SendDataAfterCts(Mac48Address source, Time duration, WifiMode txMode)
void DoNavResetNow(Time duration)
void EnableBasicBlockAck(void)
Mac48Address GetPeer(void) const
EventId m_fastAckTimeoutEvent
void AddPacketTag(const Tag &tag) const
bool DoNavStartNow(Time duration)
void FastAckFailedTimeout(void)
Mac48Address GetBssid(void) const
virtual void MissedAck(void)=0
std::pair< Mac48Address, uint8_t > AgreementKey
enum WifiModulationClass GetModulationClass() const
WifiTxVector GetCtsToSelfTxVector(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
void SetupPhyMacLowListener(Ptr< WifiPhy > phy)
#define NS_ASSERT(condition)
void Init(uint16_t winStart, uint16_t winSize)
virtual void NotifyRxEndError(void)
virtual void BlockAckInactivityTimeout(Mac48Address originator, uint8_t tid)=0
uint32_t GetSize(void) const
bool HasDurationId(void) const
DcfListeners m_dcfListeners
bool IsRunning(void) const
void SetRxCallback(Callback< void, Ptr< Packet >, const WifiMacHeader * > callback)
Time GetCompressedBlockAckTimeout() const
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
MacLowRxCallback m_rxCallback
Time GetCtsTimeout(void) const
EventId m_superFastAckTimeoutEvent
listen to events coming from ns3::MacLow.
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Time GetCtsDuration(WifiTxVector ctsTxVector) const
bool MustWaitFastAck(void) const
virtual void RegisterListener(WifiPhyListener *listener)=0
control how a packet is transmitted.The ns3::MacLow::StartTransmission method expects an instance of ...
MacLowTransmissionParameters()
void WaitSifsAfterEndTx(void)
#define NS_FATAL_ERROR(msg)
fatal error handling
MacLowTransmissionListener()
std::vector< MacLowDcfListener * >::const_iterator DcfListenersCI
void SetCtsToSelfSupported(bool enable)
void NormalAckTimeout(void)
void SetBasicBlockAckTimeout(Time blockAckTimeout)
BlockAckCaches m_bAckCaches
virtual bool IsStateIdle(void)=0
void DestroyBlockAckAgreement(Mac48Address originator, uint8_t tid)
std::pair< Ptr< Packet >, WifiMacHeader > BufferedPacket
bool m_ctsToSelfSupported
virtual void SetReceiveErrorCallback(RxErrorCallback callback)=0
void CreateBlockAckAgreement(const MgtAddBaResponseHeader *respHdr, Mac48Address originator, uint16_t startingSeq)
uint32_t GetBlockAckSize(enum BlockAckType type) const
receive notifications about phy events.
void EnableSuperFastAck(void)
virtual void StartNext(void)=0
std::map< AgreementKey, BlockAckCache >::iterator BlockAckCachesI
virtual void EndTxNoAck(void)=0
WifiTxVector GetAckTxVector(Mac48Address to, WifiMode dataTxMode) const
void SetAckTimeout(Time ackTimeout)
virtual void GotCts(double snr, WifiMode txMode)=0
AcIndex QosUtilsMapTidToAc(uint8_t tid)
void SendBlockAckResponse(const CtrlBAckResponseHeader *blockAck, Mac48Address originator, bool immediate, Time duration, WifiMode blockAckReqTxMode)
virtual void NotifyRxStart(Time duration)
void NavCounterResetCtsMissed(Time rtsEndRxTime)
Ptr< WifiRemoteStationManager > m_stationManager
bool MustWaitMultiTidBlockAck(void) const
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Mac48Address GetAddress(void) const
uint32_t GetNextPacketSize(void) const
Agreements m_bAckAgreements
bool HasNextPacket(void) const
WifiTxVector GetAckTxVectorForData(Mac48Address to, WifiMode dataTxMode) const
void RegisterDcfListener(MacLowDcfListener *listener)
NS_LOG_COMPONENT_DEFINE("MacLow")
void NotifySwitchingStartNow(Time duration)
void CancelAllEvents(void)
void StartTransmission(Ptr< const Packet > packet, const WifiMacHeader *hdr, MacLowTransmissionParameters parameters, MacLowTransmissionListener *listener)
std::ostream & operator<<(std::ostream &os, const Angles &a)
std::list< BufferedPacket >::iterator BufferedPacketI
void SetStartingSequence(uint16_t seq)
Ptr< Packet > Copy(void) const
void BlockAckTimeout(void)
void NotifyCtsTimeoutStartNow(Time duration)
Time m_overrideDurationId
void SendBlockAckAfterBlockAckRequest(const CtrlBAckRequestHeader reqHdr, Mac48Address originator, Time duration, WifiMode blockAckReqTxMode)
void EnableCompressedBlockAck(void)
void SuperFastAckTimeout(void)
void SetBssid(Mac48Address ad)
listen for block ack events.
uint32_t GetRtsSize(void) const
Time CalculateTransmissionTime(Ptr< const Packet > packet, const WifiMacHeader *hdr, const MacLowTransmissionParameters ¶meters) const
EventId m_normalAckTimeoutEvent
void StartDataTxTimers(WifiTxVector dataTxVector)
void AddTrailer(const Trailer &trailer)
void NotifyCtsTimeoutResetNow()
bool MustWaitBasicBlockAck(void) const
bool MustWaitCompressedBlockAck(void) const
uint32_t RemoveTrailer(Trailer &trailer)
virtual ~MacLowBlockAckEventListener()
virtual void Cancel(void)=0
listen to NAV eventsThis class is typically connected to an instance of ns3::Dcf and calls to its met...
void FastAckTimeout(void)
void EnableMultiTidBlockAck(void)
EventId m_ctsTimeoutEvent
void RxCompleteBufferedPacketsWithSmallerSequence(uint16_t seq, Mac48Address originator, uint8_t tid)
void SetPhy(Ptr< WifiPhy > phy)
virtual bool IsStateTx(void)=0
Time m_basicBlockAckTimeout
Time GetDurationId(void) const
virtual void MissedBlockAck(void)
void ReceiveError(Ptr< const Packet > packet, double rxSnr)
Time GetSlotTime(void) const
void SetMode(WifiMode mode)
void SetDelayedBlockAck(void)
EventId m_inactivityEvent
void SetAmsduSupport(bool supported)
virtual void NotifyMaybeCcaBusyStart(Time duration)
WifiTxVector GetRtsTxVector(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
WifiTxVector GetDataTxVector(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
handle RTS/CTS/DATA/ACK transactions.
virtual void MissedCts(void)=0
static Time CalculateTxDuration(uint32_t size, WifiTxVector txvector, enum WifiPreamble preamble)
MacLowTransmissionParameters m_txParams
virtual void DoDispose(void)
MacLowBlockAckEventListener()
void NotifyAckTimeoutResetNow()
bool MustWaitSuperFastAck(void) const
Time CalculateOverallTxTime(Ptr< const Packet > packet, const WifiMacHeader *hdr, const MacLowTransmissionParameters ¶ms) const
QueueListeners m_edcaListeners
WifiTxVector GetBlockAckTxVector(Mac48Address to, WifiMode dataTxMode) const
Maintains information for a block ack agreement.
EventId m_fastAckFailedTimeoutEvent
uint32_t QosUtilsMapSeqControlToUniqueInteger(uint16_t seqControl, uint16_t endSequence)
bool IsNavZero(void) const
void NotifyAckTimeoutStartNow(Time duration)
void SetSlotTime(Time slotTime)
Ptr< Packet > m_currentPacket
bool RemovePacketTag(Tag &tag)
void SendCtsAfterRts(Mac48Address source, Time duration, WifiMode txMode, double rtsSnr)
#define NS_LOG_DEBUG(msg)
std::map< AgreementKey, AgreementValue >::iterator AgreementsI
EventId m_endTxNoAckEvent
virtual void NotifyTxStart(Time duration)
virtual void GotBlockAck(const CtrlBAckResponseHeader *blockAck, Mac48Address source)
void EnableOverrideDurationId(Time durationId)
virtual void SetReceiveOkCallback(RxOkCallback callback)=0
bool GetCtsToSelfSupported() const
void SetCtsTimeout(Time ctsTimeout)
void EnableNextData(uint32_t size)
void SetImmediateBlockAck(void)
void DisableOverrideDurationId(void)
Time GetAckTimeout(void) const
void DisableNextData(void)
void SetStbc(bool stbcsatuts)
void SendDataPacket(void)
void SetTimeout(uint16_t timeout)
uint32_t GetCtsSize(void) const
WifiMacHeader m_currentHdr
void SetAddress(Mac48Address ad)
virtual void SendPacket(Ptr< const Packet > packet, WifiMode mode, enum WifiPreamble preamble, WifiTxVector txvector)=0
void ForwardDown(Ptr< const Packet > packet, const WifiMacHeader *hdr, WifiTxVector txVector, WifiPreamble preamble)
void ReceiveOk(Ptr< Packet > packet, double rxSnr, WifiMode txMode, WifiPreamble preamble)
PhyMacLowListener(ns3::MacLow *macLow)
Time m_compressedBlockAckTimeout
WifiMode GetMode(void) const
bool MustWaitAck(void) const
void RegisterBlockAckListenerForAc(enum AcIndex ac, MacLowBlockAckEventListener *listener)
virtual ~PhyMacLowListener()
bool IsExpired(void) const
std::pair< BlockAckAgreement, std::list< BufferedPacket > > AgreementValue
virtual void NotifySwitchingStart(Time duration)
virtual Time GetLastRxStartTime(void) const =0
WifiTxVector GetCtsTxVectorForRts(Mac48Address to, WifiMode rtsTxMode) const
void SetBufferSize(uint16_t bufferSize)
Time GetBasicBlockAckTimeout() const
void NotifyNav(Ptr< const Packet > packet, const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble)
void SendAckAfterData(Mac48Address source, Time duration, WifiMode txMode, double rtsSnr)
WifiTxVector GetCtsTxVector(Mac48Address to, WifiMode rtsTxMode) const
bool StoreMpduIfNeeded(Ptr< Packet > packet, WifiMacHeader hdr)
bool MustWaitNormalAck(void) const
virtual bool GetGreenfield(void) const =0
void AddHeader(const Header &header)
void SetCompressedBlockAckTimeout(Time blockAckTimeout)
virtual void NotifyRxEndOk(void)
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > manager)
class PhyMacLowListener * m_phyMacLowListener
virtual uint32_t GetSerializedSize(void) const
uint32_t GetSize(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
MacLowTransmissionListener * m_listener
void SendRtsForPacket(void)
void RxCompleteBufferedPacketsUntilFirstLost(Mac48Address originator, uint8_t tid)