23 #include "ns3/assert.h"
24 #include "ns3/pointer.h"
40 #undef NS_LOG_APPEND_CONTEXT
41 #define NS_LOG_APPEND_CONTEXT if (m_low != 0) { std::clog << "[mac=" << m_low->GetAddress () << "] "; }
150 .AddAttribute (
"BlockAckThreshold",
"If number of packets in this queue reaches this value,\
151 block ack mechanism is used. If this value is 0, block ack is never used.",
155 MakeUintegerChecker<uint8_t> (0, 64))
156 .AddAttribute (
"BlockAckInactivityTimeout",
"Represents max time (blocks of 1024 micro seconds) allowed for block ack\
157 inactivity. If this value isn't equal to 0 a timer start after that a\
158 block ack setup is completed and will be reset every time that a block\
159 ack frame is received. If this value is 0, block ack inactivity timeout won't be used.",
162 MakeUintegerChecker<uint16_t> ())
163 .AddAttribute (
"Queue",
"The WifiMacQueue object",
166 MakePointerChecker<WifiMacQueue> ())
181 m_queue = CreateObject<WifiMacQueue> ();
439 m_low->StartTransmission (fragment, &hdr, params,
452 Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
456 bool aggregated =
false;
457 bool isAmsdu =
false;
461 while (peekedPacket != 0)
463 aggregated =
m_aggregator->Aggregate (peekedPacket, currentAggregatedPacket,
469 m_queue->Remove (peekedPacket);
483 currentAggregatedPacket = 0;
566 packet, fullPacketSize);
567 m_queue->Enqueue (packet, hdr);
754 NS_LOG_DEBUG (
"a transmission that did not require an ACK just finished");
876 packet, fullPacketSize);
877 m_queue->PushFront (packet, hdr);
885 NS_LOG_DEBUG (
"received ADDBA response from " << recipient);
886 uint8_t tid = respHdr->
GetTid ();
891 NS_LOG_DEBUG (
"block ack agreement established with " << recipient);
907 NS_LOG_DEBUG (
"received DELBA frame from=" << recipient);
1052 uint16_t
timeout,
bool immediateBAck)
1054 NS_LOG_FUNCTION (
this << dest << static_cast<uint32_t> (tid) << startSeq << timeout << immediateBAck);
1075 reqHdr.SetImmediateBlockAck ();
1079 reqHdr.SetDelayedBlockAck ();
1081 reqHdr.SetTid (tid);
1085 reqHdr.SetBufferSize (0);
1086 reqHdr.SetTimeout (timeout);
1087 reqHdr.SetStartingSequence (startSeq);
1116 NS_LOG_FUNCTION (
this << addr << static_cast<uint32_t> (tid) << byOriginator);
Keep track of destination address - TID pairs that are waiting for a block ACK response.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void SetUnblockDestinationCallback(Callback< void, Mac48Address, uint8_t > callback)
virtual void SetMaxCw(uint32_t maxCw)
Set the maximum congestion window size.
TransmissionListener * m_transmissionListener
Ptr< const Packet > m_currentPacket
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
void DoInitialize()
This method is called only once by Object::Initialize.
TypeId AddConstructor(void)
TxFailed m_txFailedCallback
void SetBlockAckInactivityTimeout(uint16_t timeout)
uint32_t GetCwMin(void) const
Return the minimum congestion window size.
uint32_t GetFragmentSize(void)
Calculate the size of the current fragment.
void NotifyGotBlockAck(const CtrlBAckResponseHeader *blockAck, Mac48Address recipient)
uint16_t m_blockAckInactivityTimeout
void CreateAgreement(const MgtAddBaRequestHeader *reqHdr, Mac48Address recipient)
void VerifyBlockAck(void)
Verifies if dequeued packet has to be transmitted with ack policy Block Ack.
void GotBlockAck(const CtrlBAckResponseHeader *blockAck, Mac48Address recipient)
Event handler when a Block ACK is received.
void NotifyCollision(void)
Notify the EDCAF that collision has occurred.
void SetTypeOfStation(enum TypeOfStation type)
Set type of station with the given type.
void EnableBasicBlockAck(void)
Wait BASICBLOCKACKTimeout for a Basic Block Ack Response frame.
void StorePacket(Ptr< const Packet > packet, const WifiMacHeader &hdr, Time tStamp)
bool NeedDataRetransmission(void)
Check if DATA should be re-transmitted if ACK was missed.
void RequestAccess(DcfState *state)
virtual void EndTxNoAck(void)
Invoked upon the end of the transmission of a frame that does not require an ACK (e.g., broadcast and multicast frames).
void SetTxFailedCallback(TxFailed callback)
void GotAck(double snr, WifiMode txMode)
Event handler when an ACK is received.
BlockAckEventListener(EdcaTxopN *txop)
bool IsNull(void) const
Check for null implementation.
virtual void MissedBlockAck(void)
ns3::MacLow did not receive an expected BLOCK_ACK within BlockAckTimeout.
#define NS_ASSERT(condition)
virtual int64_t AssignStreams(int64_t stream)=0
Assign a fixed random variable stream number to the random variables used by this model...
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
uint8_t m_blockAckThreshold
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > remoteManager)
Set WifiRemoteStationsManager this EdcaTxopN is associated to.
bool HasBar(struct Bar &bar)
uint32_t GetSize(void) const
bool IsBroadcast(void) const
void SetBlockAckType(enum BlockAckType bAckType)
WifiMacHeader m_currentHdr
void SetAifsn(uint32_t aifsn)
virtual void Cancel(void)
Invoked if this transmission was canceled one way or another.
bool HasPackets(void) const
Returns true if there are packets that need of retransmission or at least a BAR is scheduled...
void ResetCw(void)
Update the value of the CW variable to take into account a transmission success or a transmission abo...
virtual void BlockAckInactivityTimeout(Mac48Address address, uint8_t tid)
Typically is called in order to notify EdcaTxopN that a block ack inactivity timeout occurs for the b...
friend class TransmissionListener
listen to events coming from ns3::MacLow.
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
virtual void MissedAck(void)
ns3::MacLow did not receive an expected ACK within AckTimeout.
void NextFragment(void)
Continue to the next fragment.
void SetTxOkCallback(TxOk callback)
BlockAckManager * m_baManager
control how a packet is transmitted.
bool NeedRtsRetransmission(void)
Check if RTS should be re-transmitted if CTS was missed.
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual void DoNotifyChannelSwitching(void)
Called by DcfManager to notify a DcfState subclass that a channel switching occured.
virtual uint32_t GetAifsn(void) const
Return the number of slots that make up an AIFS.
Handles sequence numbering of IEEE 802.11 data frames.
virtual void DoNotifyCollision(void)
Called by DcfManager to notify a DcfState subclass that a normal collision occured, that is, that the medium was busy when access was requested.
void MissedAck(void)
Event handler when an ACK is received.
enum TypeOfStation GetTypeOfStation(void) const
Return type of station.
void SetLow(Ptr< MacLow > low)
Set MacLow associated with this EdcaTxopN.
Ptr< MacLow > Low(void)
Return the MacLow associated with this EdcaTxopN.
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
Ptr< WifiRemoteStationManager > m_stationManager
This queue contains packets for a particular access class.
void GotDelBaFrame(const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
void SetQueue(Ptr< WifiMacQueue > queue)
void NotifyAccessGranted(void)
Notify the EDCAF that access has been granted.
NS_LOG_COMPONENT_DEFINE("EdcaTxopN")
void NotifyInternalCollision(void)
Notify the EDCAF that internal collision has occurred.
void UpdateAgreement(const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
virtual void SetMinCw(uint32_t minCw)
Set the minimum congestion window size.
void SendAddBaRequest(Mac48Address recipient, uint8_t tid, uint16_t startSeq, uint16_t timeout, bool immediateBAck)
Sends an ADDBARequest to establish a block ack agreement with sta addressed by recipient for tid tid...
void SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator)
virtual void GotAck(double snr, WifiMode txMode)
Hold an unsigned integer type.
void SetBlockAckThreshold(uint8_t threshold)
Set threshold for block ACK mechanism.
void NotifyAgreementUnsuccessful(Mac48Address recipient, uint8_t tid)
void MissedCts(void)
Event handler when a CTS timeout has occurred.
Manage a set of ns3::DcfStateHandle a set of independent ns3::DcfState, each of which represents a si...
keep track of the state needed for a single DCF function.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void NotifyChannelSwitching(void)
When a channel switching occurs, enqueued packets are removed.
void SetTxMiddle(MacTxMiddle *txMiddle)
bool IsAccessRequested(void) const
void SetBlockDestinationCallback(Callback< void, Mac48Address, uint8_t > callback)
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
Ptr< Packet > GetFragmentPacket(WifiMacHeader *hdr)
Get the next fragment from the packet with appropriate Wifi header for the fragment.
virtual void StartNext(void)
Invoked when ns3::MacLow wants to start a new transmission as configured by MacLowTransmissionParamet...
Time m_currentPacketTimestamp
uint32_t GetCwMax(void) const
Return the maximum congestion window size.
void SetCwMin(uint32_t minCw)
Set the minimum congestion window size.
virtual void GotCts(double snr, WifiMode txMode)
Ptr< Packet > Copy(void) const
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
virtual uint32_t GetMinCw(void) const
Return the minimum congestion window size.
void MissedBlockAck(void)
Event handler when a Block ACK timeout has occurred.
void EndTxNoAck(void)
Event handler when a transmission that does not require an ACK has completed.
void StartBackoffNow(uint32_t nSlots)
bool NeedFragmentation(void) const
Check if the current packet should be fragmented.
void EnableCompressedBlockAck(void)
Wait COMPRESSEDBLOCKACKTimeout for a Compressed Block Ack Response frame.
virtual void MissedCts(void)
ns3::MacLow did not receive an expected CTS within CtsTimeout.
uint16_t GetNextSequenceNumberfor(const WifiMacHeader *hdr)
Return the next sequence number for the given header.
Ptr< MsduAggregator > GetMsduAggregator(void) const
listen for block ack events.
void SetAccessCategory(enum AcIndex ac)
Set the access category of this EDCAF.
void EnableAck(void)
Wait ACKTimeout for an ACK.
Mac48Address MapDestAddressForAggregation(const WifiMacHeader &hdr)
bool ExistsAgreementInState(Mac48Address recipient, uint8_t tid, enum OriginatorBlockAckAgreement::State state) const
bool SetupBlockAckIfNeeded()
If number of packets in the queue reaches m_blockAckThreshold value, an ADDBARequest frame is sent to...
virtual ~TransmissionListener()
void StartNext(void)
Start transmission for the next fragment.
Ptr< const Packet > GetNextPacket(WifiMacHeader &hdr)
void Cancel(void)
Cancel the transmission.
void SetManager(DcfManager *manager)
Set DcfManager this EdcaTxopN is associated to.
void DisableRts(void)
Do not send rts and wait for cts before sending data.
void Queue(Ptr< const Packet > packet, const WifiMacHeader &hdr)
void SetMsduAggregator(Ptr< MsduAggregator > aggr)
void SetBlockAckInactivityCallback(Callback< void, Mac48Address, uint8_t, bool > callback)
void SetMaxPacketDelay(Time maxDelay)
void PushFront(Ptr< const Packet > packet, const WifiMacHeader &hdr)
bool SwitchToBlockAckIfNeeded(Mac48Address recipient, uint8_t tid, uint16_t startingSeq)
enum BlockAckType m_blockAckType
void SetCwMax(uint32_t maxCw)
Set the maximum congestion window size.
virtual void DoNotifyAccessGranted(void)
Called by DcfManager to notify a DcfState subclass that access to the medium is granted and can start...
static TypeId GetTypeId(void)
BlockAckEventListener * m_blockAckListener
static TypeId GetTypeId(void)
uint32_t GetNextFragmentSize(void)
Calculate the size of the next fragment.
void EnableRts(void)
Send a RTS, and wait CTSTimeout for a CTS.
void CompleteConfig(void)
Complete block ACK configuration.
uint32_t GetCw(void) const
uint32_t GetAifsn(void) const
Return the number of slots that make up an AIFS.
void Unblock(Mac48Address dest, uint8_t tid)
Un-block the given destination address and TID (e.g.
void RestartAccessIfNeeded(void)
Restart access request if needed.
void SetBlockAckThreshold(uint8_t nPackets)
QosBlockedDestinations * m_qosBlockedDestinations
#define NS_LOG_DEBUG(msg)
virtual ~BlockAckEventListener()
uint8_t GetBlockAckThreshold(void) const
Return the current threshold for block ACK mechanism.
void CompleteTx(void)
For now is typically invoked to complete transmission of a packets sent with ack policy Block Ack: th...
bool IsSuccess(void) const
Return whether the status code is success.
void SetTxMiddle(MacTxMiddle *txMiddle)
void GotCts(double snr, WifiMode txMode)
Event handler when a CTS is received.
void EnableNextData(uint32_t size)
void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
void DisableOverrideDurationId(void)
Do not force the duration/id field of the packet: its value is automatically calculated by the MacLow...
bool IsLastFragment(void) const
Check if the curren fragment is the last fragment.
void Block(Mac48Address dest, uint8_t tid)
Block the given destination address and TID from sending (e.g.
void DisableNextData(void)
Do not attempt to send data burst after current transmission.
virtual uint32_t GetMaxCw(void) const
Return the maximum congestion window size.
Ptr< WifiMacQueue > m_queue
void StartAccessIfNeeded(void)
Request access from DCF manager if needed.
virtual uint32_t GetNext(uint32_t min, uint32_t max)=0
Get integer between min and max (including min and max).
bool NeedRts(void)
Check if the current packet should be sent with a RTS protection.
void SendBlockAckRequest(const struct Bar &bar)
After that all packets, for which a block ack agreement was established, have been transmitted...
TypeOfStation
Enumeration for type of station.
void UpdateFailedCw(void)
Update the value of the CW variable to take into account a transmission failure.
Ptr< MsduAggregator > m_aggregator
Manages all block ack agreements for an originator station.
bool ExistsAgreement(Mac48Address recipient, uint8_t tid) const
virtual void DoNotifyInternalCollision(void)
Called by DcfManager to notify a DcfState subclass that an 'internal' collision occured, that is, that the backoff timer of a higher priority DcfState expired at the same time and that access was granted to this higher priority DcfState.
void DisableAck(void)
Do not wait for Ack after data transmission.
TransmissionListener(EdcaTxopN *txop)
Ptr< WifiMacQueue > GetQueue() const
Return the packet queue associated with this EdcaTxopN.
uint16_t GetNextSeqNumberByTidAndAddress(uint8_t tid, Mac48Address addr) const
Return the next sequence number for the Traffic ID and destination.
a unique identifier for an interface.
bool NeedsAccess(void) const
Check if the EDCAF requires access.
TypeId SetParent(TypeId tid)
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
uint32_t GetFragmentOffset(void)
Calculate the offset for the current fragment.
void NotifyMpduTransmission(Mac48Address recipient, uint8_t tid, uint16_t nextSeqNumber)
void AddHeader(const Header &header)
Add header to this packet.
virtual void DoInitialize(void)
This method is called only once by Object::Initialize.
void GotAddBaResponse(const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
void TearDownBlockAck(Mac48Address recipient, uint8_t tid)
Implements the IEEE 802.11 MAC trailer.
virtual void SetAifsn(uint32_t aifsn)
TypeOfStation m_typeOfStation
Mac48Address MapSrcAddressForAggregation(const WifiMacHeader &hdr)
This functions are used only to correctly set addresses in a-msdu subframe.
virtual uint32_t GetSerializedSize(void) const
virtual void GotBlockAck(const CtrlBAckResponseHeader *blockAck, Mac48Address source)