23 #include "ns3/assert.h"
24 #include "ns3/pointer.h"
26 #include "edca-txop-n.h"
28 #include "dcf-manager.h"
29 #include "mac-tx-middle.h"
30 #include "wifi-mac-trailer.h"
32 #include "random-stream.h"
33 #include "wifi-mac-queue.h"
34 #include "msdu-aggregator.h"
35 #include "mgt-headers.h"
36 #include "qos-blocked-destinations.h"
40 #undef NS_LOG_APPEND_CONTEXT
41 #define NS_LOG_APPEND_CONTEXT if (m_low != 0) { std::clog << "[mac=" << m_low->GetAddress () << "] "; }
55 m_txop->NotifyAccessGranted ();
59 m_txop->NotifyInternalCollision ();
63 m_txop->NotifyCollision ();
69 virtual void DoNotifyChannelSensing (
void)
71 m_txop->NotifyChannelSensing ();
88 m_txop->GotCts (snr, txMode);
96 m_txop->GotAck (snr, txMode);
100 m_txop->MissedAck ();
104 m_txop->GotBlockAck (blockAck, source);
108 m_txop->MissedBlockAck ();
112 m_txop->StartNext ();
120 m_txop->EndTxNoAck ();
138 m_txop->SendDelbaFrame (address, tid,
false);
148 EdcaTxopN::GetTypeId (
void)
153 .AddAttribute (
"BlockAckThreshold",
"If number of packets in this queue reaches this value,\
154 block ack mechanism is used. If this value is 0, block ack is never used.",
156 MakeUintegerAccessor (&EdcaTxopN::SetBlockAckThreshold,
157 &EdcaTxopN::GetBlockAckThreshold),
158 MakeUintegerChecker<uint8_t> (0, 64))
159 .AddAttribute (
"BlockAckInactivityTimeout",
"Represents max time (blocks of 1024 micro seconds) allowed for block ack\
160 inactivity. If this value isn't equal to 0 a timer start after that a\
161 block ack setup is completed and will be reset every time that a block\
162 ack frame is received. If this value is 0, block ack inactivity timeout won't be used.",
164 MakeUintegerAccessor (&EdcaTxopN::SetBlockAckInactivityTimeout),
165 MakeUintegerChecker<uint16_t> ())
166 .AddAttribute (
"Queue",
"The WifiMacQueue object",
168 MakePointerAccessor (&EdcaTxopN::GetQueue),
169 MakePointerChecker<WifiMacQueue> ())
174 EdcaTxopN::EdcaTxopN ()
178 m_blockAckType (COMPRESSED_BLOCK_ACK)
181 m_transmissionListener =
new EdcaTxopN::TransmissionListener (
this);
182 m_blockAckListener =
new EdcaTxopN::BlockAckEventListener (
this);
183 m_dcf =
new EdcaTxopN::Dcf (
this);
184 m_queue = CreateObject<WifiMacQueue> ();
185 m_rng =
new RealRandomStream ();
186 m_qosBlockedDestinations =
new QosBlockedDestinations ();
187 m_baManager =
new BlockAckManager ();
188 m_baManager->SetQueue (m_queue);
189 m_baManager->SetBlockAckType (m_blockAckType);
190 m_baManager->SetBlockDestinationCallback (
MakeCallback (&QosBlockedDestinations::Block, m_qosBlockedDestinations));
191 m_baManager->SetUnblockDestinationCallback (
MakeCallback (&QosBlockedDestinations::Unblock, m_qosBlockedDestinations));
192 m_baManager->SetMaxPacketDelay (m_queue->GetMaxDelay ());
195 EdcaTxopN::~EdcaTxopN ()
206 m_stationManager = 0;
207 delete m_transmissionListener;
210 delete m_qosBlockedDestinations;
212 delete m_blockAckListener;
213 m_transmissionListener = 0;
216 m_qosBlockedDestinations = 0;
218 m_blockAckListener = 0;
228 m_manager->
Add (m_dcf);
232 EdcaTxopN::SetTxOkCallback (TxOk callback)
235 m_txOkCallback = callback;
239 EdcaTxopN::SetTxFailedCallback (TxFailed callback)
242 m_txFailedCallback = callback;
246 EdcaTxopN::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> remoteManager)
249 m_stationManager = remoteManager;
252 EdcaTxopN::SetTypeOfStation (
enum TypeOfStation type)
255 m_typeOfStation = type;
259 EdcaTxopN::GetTypeOfStation (
void)
const
262 return m_typeOfStation;
266 EdcaTxopN::GetQueue ()
const
273 EdcaTxopN::SetMinCw (uint32_t minCw)
276 m_dcf->SetCwMin (minCw);
280 EdcaTxopN::SetMaxCw (uint32_t maxCw)
283 m_dcf->SetCwMax (maxCw);
287 EdcaTxopN::SetAifsn (uint32_t aifsn)
294 EdcaTxopN::GetMinCw (
void)
const
297 return m_dcf->GetCwMin ();
301 EdcaTxopN::GetMaxCw (
void)
const
304 return m_dcf->GetCwMax ();
308 EdcaTxopN::GetAifsn (
void)
const
311 return m_dcf->GetAifsn ();
315 EdcaTxopN::SetTxMiddle (MacTxMiddle *txMiddle)
318 m_txMiddle = txMiddle;
322 EdcaTxopN::Low (
void)
329 EdcaTxopN::SetLow (Ptr<MacLow> low)
336 EdcaTxopN::NeedsAccess (
void)
const
339 return !m_queue->IsEmpty () || m_currentPacket != 0 || m_baManager->
HasPackets ();
343 EdcaTxopN::NotifyAccessGranted (
void)
346 if (m_currentPacket == 0)
348 if (m_queue->IsEmpty () && !m_baManager->
HasPackets ())
353 if (m_baManager->HasBar (m_currentBar))
355 SendBlockAckRequest (m_currentBar);
360 if (m_currentPacket == 0)
362 if (m_queue->PeekFirstAvailable (&m_currentHdr, m_currentPacketTimestamp, m_qosBlockedDestinations) == 0)
367 if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().
IsBroadcast ()
368 && m_blockAckThreshold > 0
369 && !m_baManager->
ExistsAgreement (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ())
370 && SetupBlockAckIfNeeded ())
374 m_currentPacket = m_queue->DequeueFirstAvailable (&m_currentHdr, m_currentPacketTimestamp, m_qosBlockedDestinations);
377 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
378 m_currentHdr.SetSequenceNumber (sequence);
379 m_currentHdr.SetFragmentNumber (0);
380 m_currentHdr.SetNoMoreFragments ();
381 m_currentHdr.SetNoRetry ();
382 m_fragmentNumber = 0;
384 ", to=" << m_currentHdr.GetAddr1 () <<
385 ", seq=" << m_currentHdr.GetSequenceControl ());
386 if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().
IsBroadcast ())
392 MacLowTransmissionParameters params;
393 params.DisableOverrideDurationId ();
394 if (m_currentHdr.GetAddr1 ().
IsGroup ())
396 params.DisableRts ();
397 params.DisableAck ();
398 params.DisableNextData ();
399 m_low->StartTransmission (m_currentPacket,
402 m_transmissionListener);
406 else if (m_currentHdr.GetType () == WIFI_MAC_CTL_BACKREQ)
408 SendBlockAckRequest (m_currentBar);
412 if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
414 params.DisableAck ();
420 if (NeedFragmentation () && ((m_currentHdr.IsQosData ()
421 && !m_currentHdr.IsQosAmsdu ())
423 (m_currentHdr.IsData ()
424 && !m_currentHdr.IsQosData () && m_currentHdr.IsQosAmsdu ()))
425 && (m_blockAckThreshold == 0
426 || m_blockAckType == BASIC_BLOCK_ACK))
429 params.DisableRts ();
431 Ptr<Packet> fragment = GetFragmentPacket (&hdr);
432 if (IsLastFragment ())
434 NS_LOG_DEBUG (
"fragmenting last fragment size=" << fragment->GetSize ());
435 params.DisableNextData ();
439 NS_LOG_DEBUG (
"fragmenting size=" << fragment->GetSize ());
440 params.EnableNextData (GetNextFragmentSize ());
442 m_low->StartTransmission (fragment, &hdr, params,
443 m_transmissionListener);
447 WifiMacHeader peekedHdr;
448 if (m_currentHdr.IsQosData ()
449 && m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (),
450 WifiMacHeader::ADDR1, m_currentHdr.GetAddr1 ())
452 && m_aggregator != 0 && !m_currentHdr.IsRetry ())
455 Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
456 m_aggregator->Aggregate (m_currentPacket, currentAggregatedPacket,
458 MapDestAddressForAggregation (peekedHdr));
459 bool aggregated =
false;
460 bool isAmsdu =
false;
461 Ptr<const Packet> peekedPacket = m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (),
462 WifiMacHeader::ADDR1,
463 m_currentHdr.GetAddr1 ());
464 while (peekedPacket != 0)
466 aggregated = m_aggregator->Aggregate (peekedPacket, currentAggregatedPacket,
468 MapDestAddressForAggregation (peekedHdr));
472 m_queue->Remove (peekedPacket);
478 peekedPacket = m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (),
479 WifiMacHeader::ADDR1, m_currentHdr.GetAddr1 ());
483 m_currentHdr.SetQosAmsdu ();
484 m_currentHdr.SetAddr3 (m_low->GetBssid ());
485 m_currentPacket = currentAggregatedPacket;
486 currentAggregatedPacket = 0;
497 params.DisableRts ();
500 params.DisableNextData ();
501 m_low->StartTransmission (m_currentPacket, &m_currentHdr,
502 params, m_transmissionListener);
508 void EdcaTxopN::NotifyInternalCollision (
void)
515 EdcaTxopN::NotifyCollision (
void)
519 RestartAccessIfNeeded ();
523 EdcaTxopN::GotCts (
double snr, WifiMode txMode)
530 EdcaTxopN::MissedCts (
void)
534 if (!NeedRtsRetransmission ())
537 m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
538 if (!m_txFailedCallback.IsNull ())
540 m_txFailedCallback (m_currentHdr);
551 RestartAccessIfNeeded ();
563 EdcaTxopN::NotifyChannelSensing (
void)
571 EdcaTxopN::Queue (Ptr<const Packet> packet,
const WifiMacHeader &hdr)
575 uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.GetSerializedSize ();
576 m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr,
577 packet, fullPacketSize);
578 m_queue->Enqueue (packet, hdr);
579 StartAccessIfNeeded ();
583 EdcaTxopN::GotAck (
double snr, WifiMode txMode)
586 if (!NeedFragmentation ()
588 || m_currentHdr.IsQosAmsdu ())
591 if (!m_txOkCallback.IsNull ())
593 m_txOkCallback (m_currentHdr);
596 if (m_currentHdr.IsAction ())
598 WifiActionHeader actionHdr;
599 Ptr<Packet> p = m_currentPacket->
Copy ();
601 if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK
602 && actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
604 MgtDelBaHeader delBa;
605 p->PeekHeader (delBa);
606 if (delBa.IsByOriginator ())
612 m_low->DestroyBlockAckAgreement (m_currentHdr.GetAddr1 (), delBa.GetTid ());
620 RestartAccessIfNeeded ();
629 EdcaTxopN::MissedAck (
void)
633 if (!NeedDataRetransmission ())
636 m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
637 if (!m_txFailedCallback.IsNull ())
639 m_txFailedCallback (m_currentHdr);
648 m_currentHdr.SetRetry ();
652 RestartAccessIfNeeded ();
656 EdcaTxopN::MissedBlockAck (
void)
662 m_currentHdr.SetRetry ();
666 RestartAccessIfNeeded ();
670 EdcaTxopN::GetMsduAggregator (
void)
const
676 EdcaTxopN::RestartAccessIfNeeded (
void)
679 if ((m_currentPacket != 0
680 || !m_queue->IsEmpty () || m_baManager->
HasPackets ())
688 EdcaTxopN::StartAccessIfNeeded (
void)
691 if (m_currentPacket == 0
692 && (!m_queue->IsEmpty () || m_baManager->
HasPackets ())
700 EdcaTxopN::NeedRts (
void)
703 return m_stationManager->NeedRts (m_currentHdr.GetAddr1 (), &m_currentHdr,
708 EdcaTxopN::NeedRtsRetransmission (
void)
711 return m_stationManager->NeedRtsRetransmission (m_currentHdr.GetAddr1 (), &m_currentHdr,
716 EdcaTxopN::NeedDataRetransmission (
void)
719 return m_stationManager->NeedDataRetransmission (m_currentHdr.GetAddr1 (), &m_currentHdr,
724 EdcaTxopN::NextFragment (
void)
731 EdcaTxopN::StartNext (
void)
738 Ptr<Packet> fragment = GetFragmentPacket (&hdr);
739 MacLowTransmissionParameters params;
741 params.DisableRts ();
742 params.DisableOverrideDurationId ();
743 if (IsLastFragment ())
745 params.DisableNextData ();
749 params.EnableNextData (GetNextFragmentSize ());
751 Low ()->StartTransmission (fragment, &hdr, params, m_transmissionListener);
755 EdcaTxopN::Cancel (
void)
762 EdcaTxopN::EndTxNoAck (
void)
765 NS_LOG_DEBUG (
"a transmission that did not require an ACK just finished");
769 StartAccessIfNeeded ();
773 EdcaTxopN::NeedFragmentation (
void)
const
776 return m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr,
781 EdcaTxopN::GetFragmentSize (
void)
784 return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
785 m_currentPacket, m_fragmentNumber);
789 EdcaTxopN::GetNextFragmentSize (
void)
792 return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
793 m_currentPacket, m_fragmentNumber + 1);
797 EdcaTxopN::GetFragmentOffset (
void)
800 return m_stationManager->GetFragmentOffset (m_currentHdr.GetAddr1 (), &m_currentHdr,
801 m_currentPacket, m_fragmentNumber);
806 EdcaTxopN::IsLastFragment (
void)
const
809 return m_stationManager->IsLastFragment (m_currentHdr.GetAddr1 (), &m_currentHdr,
810 m_currentPacket, m_fragmentNumber);
814 EdcaTxopN::GetFragmentPacket (WifiMacHeader *hdr)
818 hdr->SetFragmentNumber (m_fragmentNumber);
819 uint32_t startOffset = GetFragmentOffset ();
820 Ptr<Packet> fragment;
821 if (IsLastFragment ())
823 hdr->SetNoMoreFragments ();
827 hdr->SetMoreFragments ();
835 EdcaTxopN::SetAccessCategory (
enum AcIndex ac)
846 if (m_typeOfStation == STA || m_typeOfStation == ADHOC_STA)
848 retval = hdr.GetAddr2 ();
852 retval = hdr.GetAddr3 ();
858 EdcaTxopN::MapDestAddressForAggregation (
const WifiMacHeader &hdr)
862 if (m_typeOfStation == AP || m_typeOfStation == ADHOC_STA)
864 retval = hdr.GetAddr1 ();
868 retval = hdr.GetAddr3 ();
874 EdcaTxopN::SetMsduAggregator (Ptr<MsduAggregator> aggr)
881 EdcaTxopN::PushFront (Ptr<const Packet> packet,
const WifiMacHeader &hdr)
885 uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.GetSerializedSize ();
886 m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr,
887 packet, fullPacketSize);
888 m_queue->PushFront (packet, hdr);
889 StartAccessIfNeeded ();
893 EdcaTxopN::GotAddBaResponse (
const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
896 NS_LOG_DEBUG (
"received ADDBA response from " << recipient);
897 uint8_t tid = respHdr->GetTid ();
900 if (respHdr->GetStatusCode ().IsSuccess ())
902 NS_LOG_DEBUG (
"block ack agreement established with " << recipient);
911 RestartAccessIfNeeded ();
915 EdcaTxopN::GotDelBaFrame (
const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
918 NS_LOG_DEBUG (
"received DELBA frame from=" << recipient);
923 EdcaTxopN::GotBlockAck (
const CtrlBAckResponseHeader *blockAck, Mac48Address recipient)
931 RestartAccessIfNeeded ();
935 EdcaTxopN::VerifyBlockAck (
void)
938 uint8_t tid = m_currentHdr.GetQosTid ();
939 Mac48Address recipient = m_currentHdr.GetAddr1 ();
940 uint16_t sequence = m_currentHdr.GetSequenceNumber ();
947 m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
952 EdcaTxopN::CompleteTx (
void)
955 if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
957 if (!m_currentHdr.IsRetry ())
959 m_baManager->
StorePacket (m_currentPacket, m_currentHdr, m_currentPacketTimestamp);
962 m_txMiddle->GetNextSeqNumberByTidAndAddress (m_currentHdr.GetQosTid (),
963 m_currentHdr.GetAddr1 ()));
968 EdcaTxopN::SetupBlockAckIfNeeded ()
971 uint8_t tid = m_currentHdr.GetQosTid ();
972 Mac48Address recipient = m_currentHdr.GetAddr1 ();
974 uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::ADDR1, recipient);
976 if (packets >= m_blockAckThreshold)
979 uint16_t startingSequence = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient);
980 SendAddBaRequest (recipient, tid, startingSequence, m_blockAckInactivityTimeout,
true);
987 EdcaTxopN::SendBlockAckRequest (
const struct Bar &bar)
991 hdr.SetType (WIFI_MAC_CTL_BACKREQ);
992 hdr.SetAddr1 (bar.recipient);
993 hdr.SetAddr2 (m_low->GetAddress ());
994 hdr.SetAddr3 (m_low->GetBssid ());
998 hdr.SetNoMoreFragments ();
1000 m_currentPacket = bar.bar;
1003 MacLowTransmissionParameters params;
1004 params.DisableRts ();
1005 params.DisableNextData ();
1006 params.DisableOverrideDurationId ();
1009 if (m_blockAckType == BASIC_BLOCK_ACK)
1011 params.EnableBasicBlockAck ();
1013 else if (m_blockAckType == COMPRESSED_BLOCK_ACK)
1015 params.EnableCompressedBlockAck ();
1017 else if (m_blockAckType == MULTI_TID_BLOCK_ACK)
1025 params.EnableAck ();
1027 m_low->StartTransmission (m_currentPacket, &m_currentHdr, params, m_transmissionListener);
1031 EdcaTxopN::CompleteConfig (
void)
1034 m_baManager->SetTxMiddle (m_txMiddle);
1035 m_low->RegisterBlockAckListenerForAc (m_ac, m_blockAckListener);
1036 m_baManager->SetBlockAckInactivityCallback (
MakeCallback (&EdcaTxopN::SendDelbaFrame,
this));
1040 EdcaTxopN::SetBlockAckThreshold (uint8_t threshold)
1043 m_blockAckThreshold = threshold;
1048 EdcaTxopN::SetBlockAckInactivityTimeout (uint16_t timeout)
1051 m_blockAckInactivityTimeout = timeout;
1055 EdcaTxopN::GetBlockAckThreshold (
void)
const
1058 return m_blockAckThreshold;
1062 EdcaTxopN::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startSeq,
1063 uint16_t timeout,
bool immediateBAck)
1065 NS_LOG_FUNCTION (
this << dest << static_cast<uint32_t> (tid) << startSeq << timeout << immediateBAck);
1069 hdr.SetAddr1 (dest);
1070 hdr.SetAddr2 (m_low->GetAddress ());
1071 hdr.SetAddr3 (m_low->GetAddress ());
1073 hdr.SetDsNotFrom ();
1075 WifiActionHeader actionHdr;
1076 WifiActionHeader::ActionValue action;
1077 action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST;
1078 actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
1080 Ptr<Packet> packet = Create<Packet> ();
1082 MgtAddBaRequestHeader reqHdr;
1083 reqHdr.SetAmsduSupport (
true);
1086 reqHdr.SetImmediateBlockAck ();
1090 reqHdr.SetDelayedBlockAck ();
1092 reqHdr.SetTid (tid);
1096 reqHdr.SetBufferSize (0);
1097 reqHdr.SetTimeout (timeout);
1098 reqHdr.SetStartingSequence (startSeq);
1102 packet->AddHeader (reqHdr);
1103 packet->AddHeader (actionHdr);
1105 m_currentPacket = packet;
1108 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
1109 m_currentHdr.SetSequenceNumber (sequence);
1110 m_currentHdr.SetFragmentNumber (0);
1111 m_currentHdr.SetNoMoreFragments ();
1112 m_currentHdr.SetNoRetry ();
1114 MacLowTransmissionParameters params;
1115 params.EnableAck ();
1116 params.DisableRts ();
1117 params.DisableNextData ();
1118 params.DisableOverrideDurationId ();
1120 m_low->StartTransmission (m_currentPacket, &m_currentHdr, params,
1121 m_transmissionListener);
1125 EdcaTxopN::SendDelbaFrame (Mac48Address addr, uint8_t tid,
bool byOriginator)
1127 NS_LOG_FUNCTION (
this << addr << static_cast<uint32_t> (tid) << byOriginator);
1130 hdr.SetAddr1 (addr);
1131 hdr.SetAddr2 (m_low->GetAddress ());
1132 hdr.SetAddr3 (m_low->GetAddress ());
1134 hdr.SetDsNotFrom ();
1136 MgtDelBaHeader delbaHdr;
1137 delbaHdr.SetTid (tid);
1140 delbaHdr.SetByOriginator ();
1144 delbaHdr.SetByRecipient ();
1147 WifiActionHeader actionHdr;
1148 WifiActionHeader::ActionValue action;
1149 action.blockAck = WifiActionHeader::BLOCK_ACK_DELBA;
1150 actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
1152 Ptr<Packet> packet = Create<Packet> ();
1153 packet->AddHeader (delbaHdr);
1154 packet->AddHeader (actionHdr);
1156 PushFront (packet, hdr);
1163 m_rng->AssignStreams (stream);
uint32_t RemoveHeader(Header &header)
#define NS_LOG_FUNCTION(parameters)
virtual void DoNotifyChannelSwitching(Time duration, uint16_t toChannel)
TypeId AddConstructor(void)
void NotifyGotBlockAck(const CtrlBAckResponseHeader *blockAck, Mac48Address recipient)
void CreateAgreement(const MgtAddBaRequestHeader *reqHdr, Mac48Address recipient)
void StorePacket(Ptr< const Packet > packet, const WifiMacHeader &hdr, Time tStamp)
void RequestAccess(DcfState *state)
virtual void EndTxNoAck(void)
virtual void MissedBlockAck(void)
#define NS_ASSERT(condition)
void NotifyChannelSwitching(Time duration)
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
bool IsBroadcast(void) const
void SetAifsn(uint32_t aifsn)
virtual void Cancel(void)
bool HasPackets(void) const
virtual void BlockAckInactivityTimeout(Mac48Address address, uint8_t tid)
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)
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual void DoNotifyCollision(void)
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
void UpdateAgreement(const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
virtual void GotAck(double snr, WifiMode txMode)
Hold an unsigned integer type.
void NotifyAgreementUnsuccessful(Mac48Address recipient, uint8_t tid)
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.Multiple instances of a DcfState can be regi...
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
bool IsAccessRequested(void) const
int64_t AssignStreams(int64_t stream)
virtual void StartNext(void)
virtual void GotCts(double snr, WifiMode txMode)
Ptr< Packet > Copy(void) const
void StartBackoffNow(uint32_t nSlots)
virtual void MissedCts(void)
hold objects of type Ptr<T>
listen for block ack events.
bool ExistsAgreementInState(Mac48Address recipient, uint8_t tid, enum OriginatorBlockAckAgreement::State state) const
Ptr< const Packet > GetNextPacket(WifiMacHeader &hdr)
bool SwitchToBlockAckIfNeeded(Mac48Address recipient, uint8_t tid, uint16_t startingSeq)
virtual void DoNotifyAccessGranted(void)
uint32_t GetCw(void) const
void SetBlockAckThreshold(uint8_t nPackets)
#define NS_LOG_DEBUG(msg)
void UpdateFailedCw(void)
bool ExistsAgreement(Mac48Address recipient, uint8_t tid) const
virtual void DoNotifyInternalCollision(void)
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void NotifyMpduTransmission(Mac48Address recipient, uint8_t tid, uint16_t nextSeqNumber)
virtual void DoInitialize(void)
void TearDownBlockAck(Mac48Address recipient, uint8_t tid)
Mac48Address MapSrcAddressForAggregation(const WifiMacHeader &hdr)
virtual void GotBlockAck(const CtrlBAckResponseHeader *blockAck, Mac48Address source)