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)
 
#define NS_LOG_COMPONENT_DEFINE(name)
 
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)
 
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)