23 #include "ns3/assert.h"
24 #include "ns3/packet.h"
25 #include "ns3/simulator.h"
29 #include "ns3/double.h"
42 #undef NS_LOG_APPEND_CONTEXT
43 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
120 m_waitAck (ACK_NONE),
122 m_overrideDurationId (
Seconds (0))
256 <<
"send rts=" << params.
m_sendRts <<
", "
275 os <<
"basic-block-ack";
278 os <<
"compressed-block-ack";
281 os <<
"multi-tid-block-ack";
339 : m_normalAckTimeoutEvent (),
340 m_fastAckTimeoutEvent (),
341 m_superFastAckTimeoutEvent (),
342 m_fastAckFailedTimeoutEvent (),
343 m_blockAckTimeoutEvent (),
344 m_ctsTimeoutEvent (),
349 m_endTxNoAckEvent (),
350 m_mpduAggregator (0),
353 m_phyMacLowListener (0),
354 m_ctsToSelfSupported (false),
355 m_receivedAtLeastOneMpdu (false)
422 bool oneRunning =
false;
652 uint32_t size, actualSize;
657 if (actualSize > size)
753 (*n).first->PeekHeader(hdr);
782 NS_LOG_DEBUG (
"switching channel. Cancelling MAC pending events");
798 NS_LOG_DEBUG (
"Device in sleep mode. Cancelling MAC pending events");
824 NotifyNav (packet,hdr, txMode, preamble);
859 else if (hdr.
IsCts ()
874 rxSnr, txMode, tag.Get ());
886 else if (hdr.
IsAck ()
899 rxSnr, txMode, tag.Get ());
957 if ((*it).second.first.IsImmediateBlockAck ())
975 NS_LOG_DEBUG (
"There's not a valid agreement for this block ack request.");
983 else if (hdr.
IsCtl ())
999 if (hdr.
IsQosAck () && !ampduSubframe)
1051 if (hdr.
IsMgt() && ampduSubframe)
1053 NS_FATAL_ERROR (
"Received management packet as part of an A-MPDU");
1073 NS_FATAL_ERROR (
"Received group addressed packet as part of an A-MPDU");
1319 uint32_t dataSize =
GetSize (packet, hdr);
1371 if (hdr.
IsRts () && navUpdated)
1384 Time navCounterResetCtsMissedDelay =
1408 (*i)->NavReset (duration);
1418 (*i)->NavStart (duration);
1422 if (newNavEnd > oldNavEnd)
1425 m_lastNavDuration = duration;
1435 (*i)->AckTimeoutStart (duration);
1443 (*i)->AckTimeoutReset ();
1451 (*i)->CtsTimeoutStart (duration);
1459 (*i)->CtsTimeoutReset ();
1470 ", size=" << packet->
GetSize () <<
1471 ", mode=" << txVector.
GetMode() <<
1486 uint8_t packetType = 0;
1491 for ( ; queueSize > 0; queueSize--)
1494 newPacket = dequeuedPacket->
Copy ();
2025 duration -= txDuration;
2028 duration = std::max (duration, newDuration);
2102 ForwardDown (packet, &ack, ackTxVector, preamble);
2108 return ((seq - winstart+ 4096) % 4096) < winsize;
2130 uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd()+ 4096) % 4096;
2133 (*it).second.first.SetWinEnd (seqNumber);
2134 int16_t winEnd = (*it).second.first.GetWinEnd ();
2135 int16_t bufferSize = (*it).second.first.GetBufferSize ();
2136 uint16_t sum = ((uint16_t)(std::abs(winEnd - bufferSize + 1))) % 4096;
2137 (*it).second.first.SetStartingSequence (sum);
2142 (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1)%4096);
2162 uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
2166 for (; i != (*it).second.second.end ()
2171 (*it).second.second.insert (i, bufferedPacket);
2176 (*j).second.UpdateWithMpdu (&hdr);
2184 uint16_t startingSeq)
2186 uint8_t tid = respHdr->
GetTid ();
2201 std::list<BufferedPacket> buffer (0);
2246 uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
2250 if (last != (*it).second.second.end ())
2252 guard = (*it).second.second.begin ()->second.GetSequenceControl () & 0xfff0;
2255 for (; i != (*it).second.second.end ()
2258 if (guard == (*i).second.GetSequenceControl ())
2260 if (!(*i).second.IsMoreFragments ())
2270 while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
2274 if (i != (*it).second.second.end ())
2276 guard = (*i).second.GetSequenceControl () & 0xfff0;
2288 while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
2292 if (i != (*it).second.second.end ())
2294 guard = (*i).second.GetSequenceControl () & 0xfff0;
2299 (*it).second.second.erase ((*it).second.second.begin (), i);
2309 uint16_t startingSeqCtrl = ((*it).second.first.GetStartingSequence () << 4) & 0xfff0;
2310 uint16_t guard = startingSeqCtrl;
2314 for (; i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl (); i++)
2316 if (!(*i).second.IsMoreFragments ())
2318 while (lastComplete != i)
2320 m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
2323 m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
2326 guard = (*i).second.IsMoreFragments () ? (guard + 1) : ((guard + 16) & 0xfff0);
2328 (*it).second.first.SetStartingSequence ((guard >> 4) & 0x0fff);
2331 (*it).second.second.erase ((*it).second.second.begin (), lastComplete);
2396 ForwardDown (packet, &hdr, blockAckReqTxVector, preamble);
2404 uint16_t seqNumber = 0;
2407 seqNumber = (*i).second.GetWinStart ();
2409 bool immediate =
true;
2413 immediate = (*it).second.first.IsImmediateBlockAck ();
2415 NS_LOG_DEBUG (
"Got Implicit block Ack Req with seq " << seqNumber);
2416 (*i).second.FillBlockAckBitmap (&blockAck);
2428 bool immediate =
false;
2437 immediate = (*it).second.first.IsImmediateBlockAck ();
2448 (*i).second.FillBlockAckBitmap (&blockAck);
2464 (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1) % 4096);
2467 (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1) % 4096);
2473 NS_LOG_DEBUG (
"there's not a valid block ack agreement with " << originator);
2521 bool normalAck =
false;
2522 bool ampduSubframe =
false;
2525 ampduSubframe =
true;
2530 (*n).first->PeekHeader(firsthdr);
2532 NotifyNav ((*n).first,firsthdr, txMode, preamble);
2537 ReceiveOk ((*n).first, rxSnr, txMode, preamble, ampduSubframe);
2541 ReceiveOk ((*n).first, rxSnr, txMode, preamble, ampduSubframe);
2557 NS_FATAL_ERROR (
"Sending a BlockAckReq with QosPolicy equal to Normal Ack");
2576 NS_LOG_DEBUG (
"There's not a valid agreement for this block ack request.");
2583 ReceiveOk (aggregatedPacket,rxSnr, txMode, preamble, ampduSubframe);
2597 if (peekedPacket == 0)
2614 bool isAmpdu =
false;
2617 newPacket = packet->
Copy();
2622 uint8_t tid =
GetTid (packet, hdr);
2626 std::map<AcIndex, MacLowBlockAckEventListener*>::const_iterator listenerIt=
m_edcaListeners.find(ac);
2628 queue = listenerIt->second->GetQueue();
2633 if (listenerIt->second->GetBlockAckAgreementExists (hdr.
GetAddr1(), tid))
2637 Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
2639 uint16_t startingSequenceNumber = 0;
2640 uint16_t currentSequenceNumber = 0;
2641 uint8_t qosPolicy = 0;
2642 uint16_t blockAckSize = 0;
2643 bool aggregated =
false;
2651 startingSequenceNumber = peekedHdr.GetSequenceNumber();
2654 currentSequenceNumber = peekedHdr.GetSequenceNumber();
2659 aggregated=
m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
2663 NS_LOG_DEBUG (
"Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<
" to A-MPDU");
2680 Ptr<const Packet> peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, peekedHdr.GetAddr1 (), tid, &tstamp);
2681 if (peekedPacket == 0)
2683 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
2686 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
2691 currentSequenceNumber = peekedHdr.GetSequenceNumber();
2694 while (
IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !
StopAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
2699 currentSequenceNumber = listenerIt->second->GetNextSequenceNumberfor (&peekedHdr);
2700 peekedHdr.SetSequenceNumber (currentSequenceNumber);
2701 peekedHdr.SetFragmentNumber (0);
2702 peekedHdr.SetNoMoreFragments ();
2703 peekedHdr.SetNoRetry ();
2710 newPacket = peekedPacket->
Copy ();
2716 aggregated =
m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
2722 listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
2724 NS_LOG_DEBUG (
"Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<
" to A-MPDU");
2728 listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
2730 listenerIt->second->RemoveFromBaQueue(tid, hdr.
GetAddr1 (), peekedHdr.GetSequenceNumber ());
2732 queue->Remove (peekedPacket);
2739 peekedPacket = listenerIt->second->PeekNextPacketInBaQueue(peekedHdr, hdr.
GetAddr1(), tid, &tstamp);
2740 if (peekedPacket == 0)
2744 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
2746 if (peekedPacket != 0)
2749 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
2753 currentSequenceNumber = peekedHdr.GetSequenceNumber();
2757 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
2759 if (peekedPacket != 0)
2762 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
2770 newPacket = packet->
Copy();
2781 listenerIt->second->CompleteTransfer(hdr.
GetAddr1 (),tid);
2787 newPacket = currentAggregatedPacket;
2789 currentAggregatedPacket = 0;
2791 listenerIt->second->SetAmpdu(
true);
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void Set(double snr)
Set the SNR to the given value.
bool MustSendRts(void) const
Time GetPifs(void) const
Return PCF Interframe Space (PIFS) of this MacLow.
uint32_t GetAckSize(void) const
Return the total ACK size (including FCS trailer).
virtual ~MacLowDcfListener()
void SetPifs(Time pifs)
Set PCF Interframe Space (PIFS) of this MacLow.
Time m_ctsTimeout
CTS timeout duration.
virtual uint32_t GetFrequency(void) const =0
uint8_t GetTid(void) const
Return the Traffic ID (TID).
virtual uint32_t GetNOutstandingPackets(Mac48Address recipient, uint8_t tid)
Simulation virtual time values and global simulation resolution.
EventId m_navCounterResetCtsMissed
Event to reset NAV when CTS is not received.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Ptr< WifiPhy > GetPhy(void) const
void ResetBlockAckInactivityTimerIfNeeded(BlockAckAgreement &agreement)
Every time that a block ack request or a packet with ack policy equals to block ack are received...
enum ns3::MacLowTransmissionParameters::@89 m_waitAck
EventId m_blockAckTimeoutEvent
Block ACK timeout event.
Time GetBlockAckDuration(Mac48Address to, WifiTxVector blockAckReqTxVector, enum BlockAckType type) const
Return the time required to transmit the Block ACK to the specified address given the TXVECTOR of the...
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
virtual ~MacLowTransmissionListener()
uint16_t GetTimeout(void) const
Return the timeout.
Time GetAckDuration(WifiTxVector ackTxVector) const
Return the time required to transmit the ACK (including preamble and FCS).
virtual void GotAck(double snr, WifiMode txMode)=0
void SetPromisc(void)
Enable promiscuous mode.
EventId m_waitSifsEvent
Wait for SIFS event.
void SendDataAfterCts(Mac48Address source, Time duration, WifiMode txMode)
Send DATA after receiving CTS.
void DoNavResetNow(Time duration)
Reset NAV with the given duration.
bool IsPromisc(void) const
Check if MacLow is operating in promiscuous mode.
bool m_receivedAtLeastOneMpdu
Flag whether an MPDU has already been successfully received while receiving an A-MPDU.
void EnableBasicBlockAck(void)
Wait BASICBLOCKACKTimeout for a Basic Block Ack Response frame.
Mac48Address GetPeer(void) const
Return the peer address.
EventId m_fastAckTimeoutEvent
Fast ACK timeout event.
Time m_pifs
PCF Interframe Space (PIFS) duration.
void ReceiveOk(Ptr< Packet > packet, double rxSnr, WifiMode txMode, WifiPreamble preamble, bool ampduSubframe)
void AddPacketTag(const Tag &tag) const
Add a packet tag.
bool DoNavStartNow(Time duration)
Start NAV with the given duration.
void FastAckFailedTimeout(void)
Event handler when fast ACK timeout occurs (busy).
Mac48Address GetBssid(void) const
Return the Basic Service Set Identification.
void SetSifs(Time sifs)
Set Short Interframe Space (SIFS) of this MacLow.
virtual void MissedAck(void)=0
ns3::MacLow did not receive an expected ACK within AckTimeout.
std::pair< Mac48Address, uint8_t > AgreementKey
enum WifiModulationClass GetModulationClass() const
WifiTxVector GetCtsToSelfTxVector(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
Return a TXVECTOR for the CTS-to-self frame.
void SetupPhyMacLowListener(Ptr< WifiPhy > phy)
Set up WifiPhy listener for this MacLow.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
void Init(uint16_t winStart, uint16_t winSize)
static const uint16_t WIFI_MAC_FCS_LENGTH
The length in octects of the IEEE 802.11 MAC FCS field.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual void NotifyRxEndError(void)
We have received the last bit of a packet for which NotifyRxStart was invoked first and...
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
virtual void BlockAckInactivityTimeout(Mac48Address originator, uint8_t tid)=0
Typically is called in order to notify EdcaTxopN that a block ack inactivity timeout occurs for the b...
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
static DeaggregatedMpdus Deaggregate(Ptr< Packet > aggregatedPacket)
Deaggregates an A-MPDU by removing the A-MPDU subframe header and padding.
bool IsBroadcast(void) const
bool StopAggregation(Ptr< const Packet > peekedPacket, WifiMacHeader peekedHdr, Ptr< Packet > aggregatedPacket, uint16_t size) const
void NotifySleepNow(void)
This method is typically invoked by the PhyMacLowListener to notify the MAC layer that the device has...
uint8_t GetTid(Ptr< const Packet > packet, const WifiMacHeader hdr) const
bool HasDurationId(void) const
std::list< std::pair< Ptr< Packet >, AmpduSubframeHeader > >::const_iterator DeaggregatedMpdusCI
A constant iterator for a list of deaggregated packets and their A-MPDU subframe headers.
#define NS_FATAL_ERROR(msg)
Fatal error handling.
bool QosUtilsIsOldPacket(uint16_t startingSeq, uint16_t seqNumber)
This function checks if packet with sequence number seqNumber is an "old" packet. ...
DcfListeners m_dcfListeners
List of MacLowDcfListener (pass events to Dcf)
uint8_t m_sentMpdus
Number of transmitted MPDUs in an A-MPDU that have not been acknowledged yet.
bool m_ampdu
Flag if the current transmission involves an A-MPDU.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
void SetRxCallback(Callback< void, Ptr< Packet >, const WifiMacHeader * > callback)
Time GetCompressedBlockAckTimeout() const
Return Compressed Block ACK timeout of this MacLow.
Callback< R > MakeNullCallback(void)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Mac48Address m_bssid
BSSID address (Mac48Address)
BlockAckType
Enumeration for different block ACK policies.
Ptr< Packet > AggregateToAmpdu(Ptr< const Packet > packet, const WifiMacHeader hdr)
EventId m_sendCtsEvent
Event to send CTS.
MacLowRxCallback m_rxCallback
Callback to pass packet up.
Time GetCtsTimeout(void) const
Return CTS timeout of this MacLow.
EventId m_superFastAckTimeoutEvent
Super fast ACK timeout event.
EventId m_sendAckEvent
Event to send ACK.
listen to events coming from ns3::MacLow.
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
void SendBlockAckAfterAmpdu(uint8_t tid, Mac48Address originator, Time duration, WifiMode blockAckReqTxMode)
Invoked after an A-MPDU has been received.
Time GetCtsDuration(WifiTxVector ctsTxVector) const
Return the time required to transmit the CTS (including preamble and FCS).
bool MustWaitFastAck(void) const
virtual void CompleteTransfer(Mac48Address address, uint8_t tid)
virtual void RegisterListener(WifiPhyListener *listener)=0
control how a packet is transmitted.
MacLowTransmissionParameters()
void WaitSifsAfterEndTx(void)
Event handler that is usually scheduled to fired at the appropriate time after completing transmissio...
MacLowTransmissionListener()
std::vector< MacLowDcfListener * >::const_iterator DcfListenersCI
typedef for an iterator for a list of MacLowDcfListener.
void SetCtsToSelfSupported(bool enable)
Enable or disable CTS-to-self capability.
void NormalAckTimeout(void)
Event handler when normal ACK timeout occurs.
void SetBasicBlockAckTimeout(Time blockAckTimeout)
Set Basic Block ACK timeout of this MacLow.
void SetNoOfMpdus(uint8_t noofmpdus)
BlockAckCaches m_bAckCaches
virtual uint16_t PeekNextSequenceNumberfor(WifiMacHeader *hdr)
Return the next sequence number for the Traffic ID and destination, but do not pick it (i...
virtual bool IsStateIdle(void)=0
virtual void CompleteMpduTx(Ptr< const Packet > packet, WifiMacHeader hdr, Time tstamp)
This function stores an MPDU (part of an A-MPDU) in blockackagreement (i.e.
void RemovePhyMacLowListener(Ptr< WifiPhy > phy)
Remove current WifiPhy listener for this MacLow.
virtual void GotBlockAck(const CtrlBAckResponseHeader *blockAck, Mac48Address source, WifiMode txMode)
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
void DestroyBlockAckAgreement(Mac48Address originator, uint8_t tid)
Time m_lastNavDuration
The duration of the latest NAV.
std::pair< Ptr< Packet >, WifiMacHeader > BufferedPacket
void SendCtsToSelf(void)
Send CTS for a CTS-to-self mechanism.
bool m_ctsToSelfSupported
Flag whether CTS-to-self is supported.
void SetAmpdu(bool supported)
Set m_ampdu to 1.
virtual void SetReceiveErrorCallback(RxErrorCallback callback)=0
void SendAckAfterData(Mac48Address source, Time duration, WifiMode dataTxMode, double dataSnr)
Send ACK after receiving DATA.
void CreateBlockAckAgreement(const MgtAddBaResponseHeader *respHdr, Mac48Address originator, uint16_t startingSeq)
Ptr< WifiMacQueue > m_aggregateQueue
Queue used for MPDU aggregation.
virtual void NotifyTxStart(Time duration, double txPowerDbm)
WifiMode m_currentMode
mode used for the current packet transmission
uint32_t GetBlockAckSize(enum BlockAckType type) const
Return the total Block ACK size (including FCS trailer).
virtual void NotifyWakeup(void)
Notify listeners that we woke up.
receive notifications about phy events.
void CtsTimeout(void)
Event handler when CTS timeout occurs.
void EnableSuperFastAck(void)
virtual void StartNext(void)=0
Invoked when ns3::MacLow wants to start a new transmission as configured by MacLowTransmissionParamet...
void EndTxNoAck(void)
A transmission that does not require an ACK has completed.
std::map< AgreementKey, BlockAckCache >::iterator BlockAckCachesI
virtual void EndTxNoAck(void)=0
Invoked upon the end of the transmission of a frame that does not require an ACK (e.g., broadcast and multicast frames).
WifiTxVector GetAckTxVector(Mac48Address to, WifiMode dataTxMode) const
Return a TXVECTOR for the ACK frame given the destination and the mode of the DATA used by the sender...
virtual void SetAmpdu(bool ampdu)
void SetAckTimeout(Time ackTimeout)
Set ACK timeout of this MacLow.
virtual void SendPacket(Ptr< const Packet > packet, WifiTxVector txvector, enum WifiPreamble preamble, uint8_t packetType)=0
virtual void GotCts(double snr, WifiMode txMode)=0
AcIndex QosUtilsMapTidToAc(uint8_t tid)
Maps TID (Traffic ID) to Access classes.
void SendBlockAckResponse(const CtrlBAckResponseHeader *blockAck, Mac48Address originator, bool immediate, Time duration, WifiMode blockAckReqTxMode)
This method creates block ack frame with header equals to blockAck and start its transmission.
Time GetRifs(void) const
Return Reduced Interframe Space (RIFS) of this MacLow.
virtual void NotifyRxStart(Time duration)
virtual void NotifySleep(void)
Notify listeners that we went to sleep.
void NavCounterResetCtsMissed(Time rtsEndRxTime)
Reset NAV after CTS was missed when the NAV was setted with RTS.
Ptr< WifiRemoteStationManager > m_stationManager
Pointer to WifiRemoteStationManager (rate control)
bool MustWaitMultiTidBlockAck(void) const
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Mac48Address GetAddress(void) const
Return the MAC address of this MacLow.
uint32_t GetNextPacketSize(void) const
Agreements m_bAckAgreements
bool HasNextPacket(void) const
The aim of the AmpduTag is to provide means for a MAC to specify that a packet includes A-MPDU since ...
WifiTxVector GetAckTxVectorForData(Mac48Address to, WifiMode dataTxMode) const
Return a TXVECTOR for the Block ACK frame given the destination and the mode of the DATA used by the ...
virtual void RemoveFromBaQueue(uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
Remove a packet after you peek in the retransmit queue and get it.
Time CalculateTxDuration(uint32_t size, WifiTxVector txvector, enum WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
void RegisterDcfListener(MacLowDcfListener *listener)
void NotifySwitchingStartNow(Time duration)
Time m_slotTime
Slot duration.
bool m_promisc
Flag if the device is operating in promiscuous mode.
void CancelAllEvents(void)
Cancel all scheduled events.
virtual void StartTransmission(Ptr< const Packet > packet, const WifiMacHeader *hdr, MacLowTransmissionParameters parameters, MacLowTransmissionListener *listener)
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
std::list< BufferedPacket >::iterator BufferedPacketI
void SetStartingSequence(uint16_t seq)
Set starting sequence number.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
void BlockAckTimeout(void)
Event handler when block ACK timeout occurs.
void NotifyCtsTimeoutStartNow(Time duration)
Notify DcfManager (via DcfListener) that CTS timer should be started for the given duration...
Time m_overrideDurationId
void SendBlockAckAfterBlockAckRequest(const CtrlBAckRequestHeader reqHdr, Mac48Address originator, Time duration, WifiMode blockAckReqTxMode)
Invoked after that a block ack request has been received.
virtual uint32_t GetNRetryNeededPackets(Mac48Address recipient, uint8_t tid) const
void EnableCompressedBlockAck(void)
Wait COMPRESSEDBLOCKACKTimeout for a Compressed Block Ack Response frame.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SuperFastAckTimeout(void)
Event handler when super fast ACK timeout occurs.
void SetBssid(Mac48Address ad)
Set the Basic Service Set Identification.
virtual void UnregisterListener(WifiPhyListener *listener)=0
listen for block ack events.
uint32_t GetRtsSize(void) const
Return the total RTS size (including FCS trailer).
void EnableAck(void)
Wait ACKTimeout for an ACK.
Time CalculateTransmissionTime(Ptr< const Packet > packet, const WifiMacHeader *hdr, const MacLowTransmissionParameters ¶meters) const
virtual uint16_t GetNextSequenceNumberfor(WifiMacHeader *hdr)
Return the next sequence number for the given header.
EventId m_normalAckTimeoutEvent
Normal ACK timeout event.
void StartDataTxTimers(WifiTxVector dataTxVector)
Start a DATA timer by scheduling appropriate ACK timeout.
void AddTrailer(const Trailer &trailer)
Add trailer to this packet.
void NotifyCtsTimeoutResetNow()
Notify DcfManager (via DcfListener) that CTS timer should be resetted.
bool MustWaitBasicBlockAck(void) const
bool MustWaitCompressedBlockAck(void) const
uint32_t RemoveTrailer(Trailer &trailer)
Remove a deserialized trailer from the internal buffer.
bool NeedCtsToSelf(void)
Check if CTS-to-self mechanism should be used for the current packet.
virtual ~MacLowBlockAckEventListener()
virtual void Cancel(void)=0
Invoked if this transmission was canceled one way or another.
Time m_ackTimeout
ACK timeout duration.
bool IsInWindow(uint16_t seq, uint16_t winstart, uint16_t winsize)
listen to NAV eventsThis class is typically connected to an instance of ns3::Dcf and calls to its met...
void FastAckTimeout(void)
Event handler when fast ACK timeout occurs (idle).
void DisableRts(void)
Do not send rts and wait for cts before sending data.
void EnableMultiTidBlockAck(void)
NOT IMPLEMENTED FOR NOW.
static Time Now(void)
Return the current simulation virtual time.
EventId m_ctsTimeoutEvent
CTS timeout event.
void RxCompleteBufferedPacketsWithSmallerSequence(uint16_t seq, Mac48Address originator, uint8_t tid)
void SetPhy(Ptr< WifiPhy > phy)
Set up WifiPhy associated with this MacLow.
virtual bool IsStateTx(void)=0
Time m_basicBlockAckTimeout
Basic block ACK timeout duration.
Time GetDurationId(void) const
virtual void MissedBlockAck(void)
ns3::MacLow did not receive an expected BLOCK_ACK within BlockAckTimeout.
Time m_sifs
Short Interframe Space (SIFS) duration.
void ReceiveError(Ptr< const Packet > packet, double rxSnr)
Time GetSlotTime(void) const
Return slot duration of this MacLow.
void SetDelayedBlockAck(void)
Set Block ACK policy to delayed ACK.
Time m_lastNavStart
The time when the latest NAV started.
EventId m_inactivityEvent
void SetAmsduSupport(bool supported)
Enable or disable A-MSDU support.
virtual void NotifyMaybeCcaBusyStart(Time duration)
WifiTxVector GetRtsTxVector(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
Return a TXVECTOR for the RTS frame given the destination.
virtual WifiTxVector GetDataTxVector(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
Return a TXVECTOR for the DATA frame given the destination.
handle RTS/CTS/DATA/ACK transactions.
virtual void MissedCts(void)=0
ns3::MacLow did not receive an expected CTS within CtsTimeout.
EventId m_sendDataEvent
Event to send DATA.
bool ReceiveMpdu(Ptr< Packet > packet, WifiMacHeader hdr)
This method updates the reorder buffer and the scoreboard when an MPDU is received in an HT station a...
MacLowTransmissionParameters m_txParams
Transmission parameters of the current packet.
void SetRifs(Time rifs)
Set Reduced Interframe Space (RIFS) of this MacLow.
virtual void DoDispose(void)
Destructor implementation.
MacLowBlockAckEventListener()
void NotifyAckTimeoutResetNow()
Notify DcfManager (via DcfListener) that ACK timer should be resetted.
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
Return a TXVECTOR for the Block ACK frame given the destination and the mode of the DATA used by the ...
Mac48Address m_self
Address of this MacLow (Mac48Address)
Maintains information for a block ack agreement.
EventId m_fastAckFailedTimeoutEvent
Fast ACK failed timeout event.
uint32_t QosUtilsMapSeqControlToUniqueInteger(uint16_t seqControl, uint16_t endSequence)
Next function is useful to correctly sort buffered packets under block ack.
bool IsNavZero(void) const
Check if NAV is zero.
void EnableRts(void)
Send a RTS, and wait CTSTimeout for a CTS.
void NotifyAckTimeoutStartNow(Time duration)
Notify DcfManager (via DcfListener) that ACK timer should be started for the given duration...
void SetSlotTime(Time slotTime)
Set slot duration of this MacLow.
Ptr< Packet > m_currentPacket
Current packet transmitted/to be transmitted.
Time GetSifs(void) const
Return Short Interframe Space (SIFS) of this MacLow.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
void SendCtsAfterRts(Mac48Address source, Time duration, WifiMode txMode, double rtsSnr)
Send CTS after receiving RTS.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
std::map< AgreementKey, AgreementValue >::iterator AgreementsI
EventId m_endTxNoAckEvent
Event for finishing transmission that does not require ACK.
void SendPacket(Ptr< const Packet > packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
Forward the packet down to WifiPhy for transmission.
void EnableOverrideDurationId(Time durationId)
virtual void SetReceiveOkCallback(RxOkCallback callback)=0
bool GetCtsToSelfSupported() const
Return whether CTS-to-self capability is supported.
std::list< std::pair< Ptr< Packet >, AmpduSubframeHeader > > DeaggregatedMpdus
A list of deaggregated packets and their A-MPDU subframe headers.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
void SetCtsTimeout(Time ctsTimeout)
Set CTS timeout of this MacLow.
void EnableNextData(uint32_t size)
void SetImmediateBlockAck(void)
Set Block ACK policy to immediate ACK.
void DeaggregateAmpduAndReceive(Ptr< Packet > aggregatedPacket, double rxSnr, WifiMode txMode, WifiPreamble preamble)
void DisableOverrideDurationId(void)
Do not force the duration/id field of the packet: its value is automatically calculated by the MacLow...
Time GetAckTimeout(void) const
Return ACK timeout of this MacLow.
EventId m_waitRifsEvent
Wait for RIFS event.
void DisableNextData(void)
Do not attempt to send data burst after current transmission.
void SendDataPacket(void)
Send DATA packet, which can be DATA-ACK or RTS-CTS-DATA-ACK transaction.
void SetTimeout(uint16_t timeout)
Set timeout.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
uint32_t GetCtsSize(void) const
Return the total CTS size (including FCS trailer).
WifiMacHeader m_currentHdr
Header of the current packet.
void SetAddress(Mac48Address ad)
Set MAC address of this MacLow.
void ForwardDown(Ptr< const Packet > packet, const WifiMacHeader *hdr, WifiTxVector txVector, WifiPreamble preamble)
Forward the packet down to WifiPhy for transmission.
PhyMacLowListener(ns3::MacLow *macLow)
Create a PhyMacLowListener for the given MacLow.
Time m_compressedBlockAckTimeout
Compressed block ACK timeout duration.
WifiMode GetMode(void) const
bool MustWaitAck(void) const
virtual Ptr< const Packet > PeekNextPacketInBaQueue(WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
bool IsAmpdu(Ptr< const Packet > packet, const WifiMacHeader hdr)
Checks if the given packet will be aggregated to an A-MPDU or not.
void FlushAggregateQueue(void)
This function is called to flush the aggregate queue, which is used for A-MPDU.
void RegisterBlockAckListenerForAc(enum AcIndex ac, MacLowBlockAckEventListener *listener)
virtual ~PhyMacLowListener()
void ResetPhy(void)
Remove WifiPhy associated with this MacLow.
void DisableAck(void)
Do not wait for Ack after data transmission.
bool IsExpired(void) const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
std::pair< BlockAckAgreement, std::list< BufferedPacket > > AgreementValue
virtual void NotifySwitchingStart(Time duration)
virtual Time GetLastRxStartTime(void) const =0
Return the start time of the last received packet.
WifiTxVector GetCtsTxVectorForRts(Mac48Address to, WifiMode rtsTxMode) const
Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS used by the sender...
void SetBufferSize(uint16_t bufferSize)
Set buffer size.
Time GetBasicBlockAckTimeout() const
Return Basic Block ACK timeout of this MacLow.
void NotifyNav(Ptr< const Packet > packet, const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble)
Time m_rifs
Reduced Interframe Space (RIFS) duration.
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
WifiTxVector GetCtsTxVector(Mac48Address to, WifiMode rtsTxMode) const
Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS used by the sender...
uint8_t GetNoOfMpdus(void) const
Introspection did not find any typical Config paths.
bool StoreMpduIfNeeded(Ptr< Packet > packet, WifiMacHeader hdr)
This method checks if exists a valid established block ack agreement.
bool MustWaitNormalAck(void) const
virtual bool GetGreenfield(void) const =0
Ptr< MpduAggregator > m_mpduAggregator
Ptr< WifiPhy > m_phy
Pointer to WifiPhy (actually send/receives frames)
void AddHeader(const Header &header)
Add header to this packet.
void SetCompressedBlockAckTimeout(Time blockAckTimeout)
Set Compressed Block ACK timeout of this MacLow.
Implements the IEEE 802.11 MAC trailer.
virtual void NotifyRxEndOk(void)
We have received the last bit of a packet for which NotifyRxStart was invoked first and...
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > manager)
Set up WifiRemoteStationManager associated with this MacLow.
class PhyMacLowListener * m_phyMacLowListener
Listener needed to monitor when a channel switching occurs.
void SetMpduAggregator(Ptr< MpduAggregator > aggregator)
Set up MpduAggregator associated with this MacLow.
virtual uint32_t GetSerializedSize(void) const
uint32_t GetSize(Ptr< const Packet > packet, const WifiMacHeader *hdr) const
Return the total size of the packet after WifiMacHeader and FCS trailer have been added...
MacLowTransmissionListener * m_listener
Transmission listener for the current packet.
void SendRtsForPacket(void)
Send RTS to begin RTS-CTS-DATA-ACK transaction.
void RxCompleteBufferedPacketsUntilFirstLost(Mac48Address originator, uint8_t tid)