A Discrete-Event Network Simulator
API
frame-exchange-manager.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Stefano Avallone <stavallo@unina.it>
19  */
20 
21 #include "ns3/log.h"
22 #include "ns3/abort.h"
23 #include "frame-exchange-manager.h"
24 #include "wifi-utils.h"
25 #include "snr-tag.h"
26 #include "wifi-mac-queue.h"
27 #include "wifi-mac-trailer.h"
28 
29 #undef NS_LOG_APPEND_CONTEXT
30 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
31 
32 // Time (in nanoseconds) to be added to the PSDU duration to yield the duration
33 // of the timer that is started when the PHY indicates the start of the reception
34 // of a frame and we are waiting for a response.
35 #define PSDU_DURATION_SAFEGUARD 400
36 
37 namespace ns3 {
38 
39 NS_LOG_COMPONENT_DEFINE ("FrameExchangeManager");
40 
41 NS_OBJECT_ENSURE_REGISTERED (FrameExchangeManager);
42 
43 TypeId
45 {
46  static TypeId tid = TypeId ("ns3::FrameExchangeManager")
47  .SetParent<Object> ()
48  .AddConstructor<FrameExchangeManager> ()
49  .SetGroupName ("Wifi")
50  ;
51  return tid;
52 }
53 
55  : m_navEnd (Seconds (0)),
56  m_promisc (false),
57  m_moreFragments (false)
58 {
59  NS_LOG_FUNCTION (this);
60 }
61 
63 {
65 }
66 
67 void
69 {
70  NS_LOG_FUNCTION (this);
71  m_txTimer.Cancel ();
73  {
75  }
77  m_mpdu = 0;
78  m_txParams.Clear ();
79  m_dcf = 0;
80 }
81 
82 void
84 {
85  NS_LOG_FUNCTION (this);
86  Reset ();
88  m_mac = 0;
89  m_txMiddle = 0;
90  m_rxMiddle = 0;
93  m_ackManager = 0;
94  if (m_phy != 0)
95  {
96  m_phy->TraceDisconnectWithoutContext ("PhyRxPayloadBegin",
98  }
99  m_phy = 0;
101 }
102 
103 void
105 {
106  NS_LOG_FUNCTION (this << protectionManager);
107  m_protectionManager = protectionManager;
108 }
109 
112 {
113  return m_protectionManager;
114 }
115 
116 void
118 {
119  NS_LOG_FUNCTION (this << ackManager);
120  m_ackManager = ackManager;
121 }
122 
125 {
126  return m_ackManager;
127 }
128 
129 void
131 {
132  NS_LOG_FUNCTION (this << mac);
133  m_mac = mac;
134 }
135 
136 void
138 {
139  NS_LOG_FUNCTION (this << txMiddle);
140  m_txMiddle = txMiddle;
141 }
142 
143 void
145 {
146  NS_LOG_FUNCTION (this << rxMiddle);
147  m_rxMiddle = rxMiddle;
148 }
149 
150 void
152 {
153  NS_LOG_FUNCTION (this << channelAccessManager);
154  m_channelAccessManager = channelAccessManager;
155 }
156 
157 void
159 {
160  NS_LOG_FUNCTION (this << phy);
161  m_phy = phy;
162  m_phy->TraceConnectWithoutContext ("PhyRxPayloadBegin",
165 }
166 
167 void
169 {
170  m_phy->TraceDisconnectWithoutContext ("PhyRxPayloadBegin",
173  m_phy = 0;
174 }
175 
176 void
178 {
179  NS_LOG_FUNCTION (this << address);
180  m_self = address;
181 }
182 
183 void
185 {
186  NS_LOG_FUNCTION (this << bssid);
187  m_bssid = bssid;
188 }
189 
190 void
192 {
193  NS_LOG_FUNCTION (this << &callback);
194  m_droppedMpduCallback = callback;
195 }
196 
197 void
199 {
200  NS_LOG_FUNCTION (this << &callback);
201  m_ackedMpduCallback = callback;
202 }
203 
204 void
206 {
207  m_promisc = true;
208 }
209 
210 bool
212 {
213  return m_promisc;
214 }
215 
216 const WifiTxTimer&
218 {
219  return m_txTimer;
220 }
221 
222 void
224 {
226  {
228  }
229 }
230 
231 void
233 {
234  NS_LOG_FUNCTION (this << "PSDU reception started for " << psduDuration.As (Time::US)
235  << " (txVector: " << txVector << ")");
236 
238  "The TX timer and the NAV reset event cannot be both running");
239 
240  // No need to reschedule timeouts if PSDU duration is null. In this case,
241  // PHY-RXEND immediately follows PHY-RXSTART (e.g. when PPDU has been filtered)
242  // and CCA will take over
243  if (m_txTimer.IsRunning () && psduDuration.IsStrictlyPositive ())
244  {
245  // we are waiting for a response and something arrived
246  NS_LOG_DEBUG ("Rescheduling timeout event");
248  // PHY has switched to RX, so we can reset the ack timeout
249  m_channelAccessManager->NotifyAckTimeoutResetNow ();
250  }
251 
252  if (m_navResetEvent.IsRunning ())
253  {
255  }
256 }
257 
258 bool
260 {
261  NS_LOG_FUNCTION (this << dcf);
262 
263  NS_ASSERT (m_mpdu == 0);
264  if (m_txTimer.IsRunning ())
265  {
266  m_txTimer.Cancel ();
267  }
268  m_dcf = dcf;
269 
270  Ptr<WifiMacQueue> queue = dcf->GetWifiMacQueue ();
271 
272  // Even though channel access is requested when the queue is not empty, at
273  // the time channel access is granted the lifetime of the packet might be
274  // expired and the queue might be empty.
275  if (queue->IsEmpty ())
276  {
277  NS_LOG_DEBUG ("Queue empty");
279  m_dcf = 0;
280  return false;
281  }
282 
284  Ptr<WifiMacQueueItem> mpdu = queue->Peek ()->GetItem ();
285  NS_ASSERT (mpdu != 0);
286  NS_ASSERT (mpdu->GetHeader ().IsData () || mpdu->GetHeader ().IsMgt ());
287 
288  // assign a sequence number if this is not a fragment nor a retransmission
289  if (!mpdu->IsFragment () && !mpdu->GetHeader ().IsRetry ())
290  {
291  uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&mpdu->GetHeader ());
292  mpdu->GetHeader ().SetSequenceNumber (sequence);
293  }
294 
295  NS_LOG_DEBUG ("MPDU payload size=" << mpdu->GetPacketSize () <<
296  ", to=" << mpdu->GetHeader ().GetAddr1 () <<
297  ", seq=" << mpdu->GetHeader ().GetSequenceControl ());
298 
299  // check if the MSDU needs to be fragmented
300  mpdu = GetFirstFragmentIfNeeded (mpdu);
301 
303  NS_ASSERT (m_ackManager != 0);
304  WifiTxParameters txParams;
305  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ());
306  txParams.m_protection = m_protectionManager->TryAddMpdu (mpdu, txParams);
307  txParams.m_acknowledgment = m_ackManager->TryAddMpdu (mpdu, txParams);
308  txParams.AddMpdu (mpdu);
309  UpdateTxDuration (mpdu->GetHeader ().GetAddr1 (), txParams);
310 
311  SendMpduWithProtection (mpdu, txParams);
312 
313  return true;
314 }
315 
318 {
319  NS_LOG_FUNCTION (this << *mpdu);
320 
321  if (mpdu->IsFragment ())
322  {
323  // a fragment cannot be further fragmented
325  }
326  else if (m_mac->GetWifiRemoteStationManager ()->NeedFragmentation (mpdu))
327  {
328  NS_LOG_DEBUG ("Fragmenting the MSDU");
329  m_fragmentedPacket = mpdu->GetPacket ()->Copy ();
330  // create the first fragment
331  Ptr<Packet> fragment = m_fragmentedPacket->CreateFragment (0, m_mac->GetWifiRemoteStationManager ()->GetFragmentSize (mpdu, 0));
332  // enqueue the first fragment
333  Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (fragment, mpdu->GetHeader (), mpdu->GetTimeStamp ());
334  item->GetHeader ().SetMoreFragments ();
335  m_mac->GetTxopQueue (mpdu->GetQueueAc ())->Replace (mpdu, item);
336  return item;
337  }
338  return mpdu;
339 }
340 
341 void
343 {
344  NS_LOG_FUNCTION (this << *mpdu << &txParams);
345 
346  m_mpdu = mpdu;
347  m_txParams = std::move (txParams);
348 
349  // If protection is required, the MPDU must be stored in some queue because
350  // it is not put back in a queue if the RTS/CTS exchange fails
352  || m_mpdu->GetHeader ().IsCtl ()
353  || m_mpdu->IsQueued ());
354 
355  // Make sure that the acknowledgment time has been computed, so that SendRts()
356  // and SendCtsToSelf() can reuse this value.
358 
359  if (m_txParams.m_acknowledgment->acknowledgmentTime == Time::Min ())
360  {
362  }
363 
364  // Set QoS Ack policy if this is a QoS data frame
366 
367  switch (m_txParams.m_protection->method)
368  {
371  break;
374  break;
376  SendMpdu ();
377  break;
378  default:
379  NS_ABORT_MSG ("Unknown protection type");
380  }
381 }
382 
383 void
385 {
386  NS_LOG_FUNCTION (this);
387 
389 
391 
393  {
395 
396  if (!m_mpdu->GetHeader ().IsQosData ()
398  {
399  // No acknowledgment, hence dequeue the MPDU if it is stored in a queue
401  }
402  }
404  {
407 
408  // the timeout duration is "aSIFSTime + aSlotTime + aRxPHYStartDelay, starting
409  // at the PHY-TXEND.confirm primitive" (section 10.3.2.9 or 10.22.2.2 of 802.11-2016).
410  // aRxPHYStartDelay equals the time to transmit the PHY header.
411  WifiNormalAck* normalAcknowledgment = static_cast<WifiNormalAck*> (m_txParams.m_acknowledgment.get ());
412 
413  Time timeout = txDuration
414  + m_phy->GetSifs ()
415  + m_phy->GetSlot ()
416  + m_phy->CalculatePhyPreambleAndHeaderDuration (normalAcknowledgment->ackTxVector);
419  this, m_mpdu, m_txParams.m_txVector);
420  m_channelAccessManager->NotifyAckTimeoutStartNow (timeout);
421  }
422  else
423  {
424  NS_ABORT_MSG ("Unable to handle the selected acknowledgment method ("
425  << m_txParams.m_acknowledgment.get () << ")");
426  }
427 
428  // transmit the MPDU
430 
432  {
433  // we are done with frames that do not require acknowledgment
434  m_mpdu = 0;
435  }
436 }
437 
438 void
440 {
441  NS_LOG_FUNCTION (this << *mpdu << txVector);
442 
443  m_phy->Send (Create<WifiPsdu> (mpdu, false), txVector);
444 }
445 
446 void
448 {
449  NS_LOG_DEBUG (this << *mpdu);
450 
451  if (mpdu->IsQueued ())
452  {
453  m_mac->GetTxopQueue (mpdu->GetQueueAc ())->DequeueIfQueued (mpdu);
454  }
455 }
456 
457 void
459 {
460  NS_LOG_FUNCTION (this << protection);
461  NS_ASSERT (protection != nullptr);
462 
463  if (protection->method == WifiProtection::NONE)
464  {
465  protection->protectionTime = Seconds (0);
466  }
467  else if (protection->method == WifiProtection::RTS_CTS)
468  {
469  WifiRtsCtsProtection* rtsCtsProtection = static_cast<WifiRtsCtsProtection*> (protection);
470  rtsCtsProtection->protectionTime = m_phy->CalculateTxDuration (GetRtsSize (), rtsCtsProtection->rtsTxVector,
471  m_phy->GetPhyBand ())
472  + m_phy->CalculateTxDuration (GetCtsSize (), rtsCtsProtection->ctsTxVector,
473  m_phy->GetPhyBand ())
474  + 2 * m_phy->GetSifs ();
475  }
476  else if (protection->method == WifiProtection::CTS_TO_SELF)
477  {
478  WifiCtsToSelfProtection* ctsToSelfProtection = static_cast<WifiCtsToSelfProtection*> (protection);
479  ctsToSelfProtection->protectionTime = m_phy->CalculateTxDuration (GetCtsSize (),
480  ctsToSelfProtection->ctsTxVector,
481  m_phy->GetPhyBand ())
482  + m_phy->GetSifs ();
483  }
484 }
485 
486 void
488 {
489  NS_LOG_FUNCTION (this << acknowledgment);
490  NS_ASSERT (acknowledgment != nullptr);
491 
492  if (acknowledgment->method == WifiAcknowledgment::NONE)
493  {
494  acknowledgment->acknowledgmentTime = Seconds (0);
495  }
496  else if (acknowledgment->method == WifiAcknowledgment::NORMAL_ACK)
497  {
498  WifiNormalAck* normalAcknowledgment = static_cast<WifiNormalAck*> (acknowledgment);
499  normalAcknowledgment->acknowledgmentTime = m_phy->GetSifs ()
501  normalAcknowledgment->ackTxVector,
502  m_phy->GetPhyBand ());
503  }
504 }
505 
506 Time
507 FrameExchangeManager::GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
508  const WifiTxParameters& txParams) const
509 {
510  return m_phy->CalculateTxDuration (ppduPayloadSize, txParams.m_txVector, m_phy->GetPhyBand ());
511 }
512 
513 void
515 {
516  txParams.m_txDuration = GetTxDuration (txParams.GetSize (receiver), receiver, txParams);
517 }
518 
519 Time
521  const WifiTxParameters& txParams,
522  Ptr<Packet> fragmentedPacket) const
523 {
524  NS_LOG_FUNCTION (this << header << size << &txParams << fragmentedPacket);
525 
526  NS_ASSERT (txParams.m_acknowledgment && txParams.m_acknowledgment->acknowledgmentTime != Time::Min ());
527  Time durationId = txParams.m_acknowledgment->acknowledgmentTime;
528 
529  // if the current frame is a fragment followed by another fragment, we have to
530  // update the Duration/ID to cover the next fragment and the corresponding Ack
531  if (header.IsMoreFragments ())
532  {
533  uint32_t payloadSize = size - header.GetSize () - WIFI_MAC_FCS_LENGTH;
534  uint32_t nextFragmentOffset = (header.GetFragmentNumber () + 1) * payloadSize;
535  uint32_t nextFragmentSize = std::min (fragmentedPacket->GetSize () - nextFragmentOffset,
536  payloadSize);
537  WifiTxVector ackTxVector = m_mac->GetWifiRemoteStationManager ()->GetAckTxVector (header.GetAddr1 (),
538  txParams.m_txVector);
539 
540  durationId += 2 * m_phy->GetSifs ()
541  + m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, m_phy->GetPhyBand ())
542  + m_phy->CalculateTxDuration (nextFragmentSize, txParams.m_txVector, m_phy->GetPhyBand ());
543  }
544  return durationId;
545 }
546 
547 Time
548 FrameExchangeManager::GetRtsDurationId (const WifiTxVector& rtsTxVector, Time txDuration, Time response) const
549 {
550  NS_LOG_FUNCTION (this << rtsTxVector << txDuration << response);
551 
552  WifiTxVector ctsTxVector;
553  ctsTxVector = m_mac->GetWifiRemoteStationManager ()->GetCtsTxVector (m_self, rtsTxVector.GetMode ());
554 
555  return m_phy->GetSifs ()
556  + m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, m_phy->GetPhyBand ()) /* CTS */
557  + m_phy->GetSifs () + txDuration + response;
558 }
559 
560 void
562 {
563  NS_LOG_FUNCTION (this << &txParams);
564 
565  NS_ASSERT (txParams.GetPsduInfoMap ().size () == 1);
566  Mac48Address receiver = txParams.GetPsduInfoMap ().begin ()->first;
567 
568  WifiMacHeader rts;
570  rts.SetDsNotFrom ();
571  rts.SetDsNotTo ();
572  rts.SetNoRetry ();
573  rts.SetNoMoreFragments ();
574  rts.SetAddr1 (receiver);
575  rts.SetAddr2 (m_self);
576 
577  NS_ASSERT (txParams.m_protection && txParams.m_protection->method == WifiProtection::RTS_CTS);
578  WifiRtsCtsProtection* rtsCtsProtection = static_cast<WifiRtsCtsProtection*> (txParams.m_protection.get ());
579 
580  NS_ASSERT (txParams.m_txDuration != Time::Min ());
581  rts.SetDuration (GetRtsDurationId (rtsCtsProtection->rtsTxVector, txParams.m_txDuration,
582  txParams.m_acknowledgment->acknowledgmentTime));
583  Ptr<WifiMacQueueItem> mpdu = Create<WifiMacQueueItem> (Create<Packet> (), rts);
584 
585  // After transmitting an RTS frame, the STA shall wait for a CTSTimeout interval with
586  // a value of aSIFSTime + aSlotTime + aRxPHYStartDelay (IEEE 802.11-2016 sec. 10.3.2.7).
587  // aRxPHYStartDelay equals the time to transmit the PHY header.
589  + m_phy->GetSifs ()
590  + m_phy->GetSlot ()
594  mpdu, rtsCtsProtection->rtsTxVector);
595  m_channelAccessManager->NotifyCtsTimeoutStartNow (timeout);
596 
597  ForwardMpduDown (mpdu, rtsCtsProtection->rtsTxVector);
598 }
599 
600 void
602  double rtsSnr)
603 {
604  NS_LOG_FUNCTION (this << rtsHdr << ctsTxVector << rtsSnr);
605 
606  WifiMacHeader cts;
608  cts.SetDsNotFrom ();
609  cts.SetDsNotTo ();
610  cts.SetNoMoreFragments ();
611  cts.SetNoRetry ();
612  cts.SetAddr1 (rtsHdr.GetAddr2 ());
613  Time duration = rtsHdr.GetDuration () - m_phy->GetSifs ()
614  - m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, m_phy->GetPhyBand ());
615  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
616  if (duration.IsStrictlyNegative ())
617  {
618  duration = Seconds (0);
619  }
620  cts.SetDuration (duration);
621 
622  Ptr<Packet> packet = Create<Packet> ();
623 
624  SnrTag tag;
625  tag.Set (rtsSnr);
626  packet->AddPacketTag (tag);
627 
628  // CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
629  ForwardMpduDown (Create<WifiMacQueueItem> (packet, cts), ctsTxVector);
630 }
631 
632 void
633 FrameExchangeManager::SendCtsAfterRts (const WifiMacHeader& rtsHdr, WifiMode rtsTxMode, double rtsSnr)
634 {
635  NS_LOG_FUNCTION (this << rtsHdr << rtsTxMode << rtsSnr);
636 
637  WifiTxVector ctsTxVector = m_mac->GetWifiRemoteStationManager ()->GetCtsTxVector (rtsHdr.GetAddr2 (), rtsTxMode);
638  DoSendCtsAfterRts (rtsHdr, ctsTxVector, rtsSnr);
639 }
640 
641 Time
643  Time txDuration, Time response) const
644 {
645  NS_LOG_FUNCTION (this << ctsTxVector << txDuration << response);
646 
647  return m_phy->GetSifs () + txDuration + response;
648 }
649 
650 void
652 {
653  NS_LOG_FUNCTION (this << &txParams);
654 
655  WifiMacHeader cts;
657  cts.SetDsNotFrom ();
658  cts.SetDsNotTo ();
659  cts.SetNoMoreFragments ();
660  cts.SetNoRetry ();
661  cts.SetAddr1 (m_self);
662 
663  NS_ASSERT (txParams.m_protection && txParams.m_protection->method == WifiProtection::CTS_TO_SELF);
664  WifiCtsToSelfProtection* ctsToSelfProtection = static_cast<WifiCtsToSelfProtection*> (txParams.m_protection.get ());
665 
666  NS_ASSERT (txParams.m_txDuration != Time::Min ());
667  cts.SetDuration (GetCtsToSelfDurationId (ctsToSelfProtection->ctsTxVector, txParams.m_txDuration,
668  txParams.m_acknowledgment->acknowledgmentTime));
669 
670  ForwardMpduDown (Create<WifiMacQueueItem> (Create<Packet> (), cts), ctsToSelfProtection->ctsTxVector);
671 
672  Time ctsDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsToSelfProtection->ctsTxVector,
673  m_phy->GetPhyBand ());
675 }
676 
677 void
679  double dataSnr)
680 {
681  NS_LOG_FUNCTION (this << hdr << dataTxVector << dataSnr);
682 
683  WifiTxVector ackTxVector = m_mac->GetWifiRemoteStationManager ()->GetAckTxVector (hdr.GetAddr2 (), dataTxVector);
684  WifiMacHeader ack;
686  ack.SetDsNotFrom ();
687  ack.SetDsNotTo ();
688  ack.SetNoRetry ();
689  ack.SetNoMoreFragments ();
690  ack.SetAddr1 (hdr.GetAddr2 ());
691  // 802.11-2016, Section 9.2.5.7: Duration/ID is received duration value
692  // minus the time to transmit the Ack frame and its SIFS interval
693  Time duration = hdr.GetDuration () - m_phy->GetSifs ()
694  - m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, m_phy->GetPhyBand ());
695  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
696  if (duration.IsStrictlyNegative ())
697  {
698  duration = Seconds (0);
699  }
700  ack.SetDuration (duration);
701 
702  Ptr<Packet> packet = Create<Packet> ();
703 
704  SnrTag tag;
705  tag.Set (dataSnr);
706  packet->AddPacketTag (tag);
707 
708  ForwardMpduDown (Create<WifiMacQueueItem> (packet, ack), ackTxVector);
709 }
710 
713 {
714  NS_LOG_FUNCTION (this);
716 
717  WifiMacHeader& hdr = m_mpdu->GetHeader ();
718  hdr.SetFragmentNumber (hdr.GetFragmentNumber () + 1);
719 
720  uint32_t startOffset = hdr.GetFragmentNumber () * m_mpdu->GetPacketSize ();
721  uint32_t size = m_fragmentedPacket->GetSize () - startOffset;
722 
723  if (size > m_mpdu->GetPacketSize ())
724  {
725  // this is not the last fragment
726  size = m_mpdu->GetPacketSize ();
727  hdr.SetMoreFragments ();
728  }
729  else
730  {
731  hdr.SetNoMoreFragments ();
732  }
733 
734  return Create<WifiMacQueueItem> (m_fragmentedPacket->CreateFragment (startOffset, size), hdr);
735 }
736 
737 void
739 {
740  NS_LOG_FUNCTION (this);
741 
742  // Upon a transmission success, a non-QoS station transmits the next fragment,
743  // if any, or releases the channel, otherwise
744  if (m_moreFragments)
745  {
746  NS_LOG_DEBUG ("Schedule transmission of next fragment in a SIFS");
748  m_moreFragments = false;
749  }
750  else
751  {
753  m_dcf = 0;
754  }
755 }
756 
757 void
759 {
760  NS_LOG_FUNCTION (this);
761  // A non-QoS station always releases the channel upon a transmission failure
763  m_dcf = 0;
764 }
765 
766 void
768 {
769  NS_LOG_FUNCTION (this << *mpdu << txVector);
770 
771  m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (mpdu);
772 
773  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (mpdu))
774  {
775  NS_LOG_DEBUG ("Missed Ack, discard MPDU");
776  NotifyPacketDiscarded (mpdu);
777  // Dequeue the MPDU if it is stored in a queue
778  DequeueMpdu (mpdu);
779  m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (mpdu);
780  m_dcf->ResetCw ();
781  }
782  else
783  {
784  NS_LOG_DEBUG ("Missed Ack, retransmit MPDU");
785  mpdu->GetHeader ().SetRetry ();
787  m_dcf->UpdateFailedCw ();
788  }
789 
790  m_mpdu = 0;
792 }
793 
794 void
796 {
797  NS_LOG_FUNCTION (this << *mpdu);
798 }
799 
800 void
802 {
803  NS_LOG_FUNCTION (this << *rts << txVector);
804 
805  m_mac->GetWifiRemoteStationManager ()->ReportRtsFailed (m_mpdu->GetHeader ());
806 
807  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (m_mpdu))
808  {
809  NS_LOG_DEBUG ("Missed CTS, discard MPDU");
810  // Dequeue the MPDU if it is stored in a queue
813  m_mac->GetWifiRemoteStationManager ()->ReportFinalRtsFailed (m_mpdu->GetHeader ());
814  m_dcf->ResetCw ();
815  }
816  else
817  {
818  NS_LOG_DEBUG ("Missed CTS, retransmit RTS");
820  m_dcf->UpdateFailedCw ();
821  }
822  m_mpdu = 0;
824 }
825 
826 void
828 {
829  NS_LOG_FUNCTION (this << *mpdu);
830 
831  // the MPDU should be still in the DCF queue, unless it expired.
832  // If the MPDU has never been transmitted, it will be assigned a sequence
833  // number again the next time we try to transmit it. Therefore, we need to
834  // make its sequence number available again
835  if (!mpdu->GetHeader ().IsRetry ())
836  {
837  m_txMiddle->SetSequenceNumberFor (&mpdu->GetHeader ());
838  }
839 }
840 
841 void
843 {
844  NS_LOG_FUNCTION (this);
845 
846  // For internal collisions occurring with the EDCA access method, the appropriate
847  // retry counters (short retry counter for MSDU, A-MSDU, or MMPDU and QSRC[AC] or
848  // long retry counter for MSDU, A-MSDU, or MMPDU and QLRC[AC]) are incremented
849  // (Sec. 10.22.2.11.1 of 802.11-2016).
850  // We do not prepare the PSDU that the AC losing the internal collision would have
851  // sent. As an approximation, we consider the frame peeked from the queues of the AC.
852  Ptr<QosTxop> qosTxop = (txop->IsQosTxop () ? StaticCast<QosTxop> (txop) : nullptr);
853 
854  Ptr<const WifiMacQueueItem> mpdu = (qosTxop != nullptr ? qosTxop->PeekNextMpdu ()
855  : txop->GetWifiMacQueue ()->Peek ());
856 
857  if (mpdu != nullptr)
858  {
859  if (mpdu->GetHeader ().HasData ()
860  && !mpdu->GetHeader ().GetAddr1 ().IsGroup ())
861  {
862  m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (mpdu);
863  }
864 
865  if (!mpdu->GetHeader ().GetAddr1 ().IsGroup ()
866  && !m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (mpdu))
867  {
868  NS_LOG_DEBUG ("reset DCF");
869  m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (mpdu);
870  DequeueMpdu (mpdu);
871  NotifyPacketDiscarded (mpdu);
872  txop->ResetCw ();
873  }
874  else
875  {
876  NS_LOG_DEBUG ("Update CW");
877  txop->UpdateFailedCw ();
878  }
879  }
880 
881  txop->Txop::NotifyChannelReleased ();
882 }
883 
884 void
886 {
887  NS_LOG_DEBUG ("Switching channel. Cancelling MAC pending events");
888  m_mac->GetWifiRemoteStationManager ()->Reset ();
889  Reset ();
890 }
891 
892 void
894 {
895  NS_LOG_DEBUG ("Device in sleep mode. Cancelling MAC pending events");
896  Reset ();
897 }
898 
899 void
901 {
902  NS_LOG_DEBUG ("Device is switched off. Cancelling MAC pending events");
903  Reset ();
904 }
905 
906 void
908  WifiTxVector txVector, std::vector<bool> perMpduStatus)
909 {
910  NS_LOG_FUNCTION (this << psdu << rxSignalInfo << txVector << perMpduStatus.size ()
911  << std::all_of (perMpduStatus.begin(), perMpduStatus.end(), [](bool v) { return v; }));
912 
913  if (!perMpduStatus.empty ())
914  {
915  // for A-MPDUs, we get here only once
916  PreProcessFrame (psdu, txVector);
917  }
918 
919  // ignore unicast frames that are not addressed to us
920  Mac48Address addr1 = psdu->GetAddr1 ();
921  if (!addr1.IsGroup () && addr1 != m_self)
922  {
923  if (m_promisc && psdu->GetNMpdus () == 1 && psdu->GetHeader (0).IsData ())
924  {
925  m_rxMiddle->Receive (*psdu->begin ());
926  }
927  return;
928  }
929 
930  if (psdu->GetNMpdus () == 1)
931  {
932  // if perMpduStatus is not empty (i.e., this MPDU is not included in an A-MPDU)
933  // then it must contain a single value which must be true (i.e., the MPDU
934  // has been correctly received)
935  NS_ASSERT (perMpduStatus.empty () || (perMpduStatus.size () == 1 && perMpduStatus[0]));
936  // Ack and CTS do not carry Addr2
937  if (!psdu->GetHeader (0).IsAck () && !psdu->GetHeader (0).IsCts ())
938  {
939  m_mac->GetWifiRemoteStationManager ()->ReportRxOk (psdu->GetHeader (0).GetAddr2 (),
940  rxSignalInfo, txVector);
941  }
942  ReceiveMpdu (*(psdu->begin ()), rxSignalInfo, txVector, perMpduStatus.empty ());
943  }
944  else
945  {
946  EndReceiveAmpdu (psdu, rxSignalInfo, txVector, perMpduStatus);
947  }
948 }
949 
950 void
952 {
953  NS_LOG_FUNCTION (this << psdu << txVector);
954 
955  UpdateNav (psdu, txVector);
956 }
957 
958 void
960 {
961  NS_LOG_FUNCTION (this << psdu << txVector);
962 
963  if (psdu->GetHeader (0).GetRawDuration () > 32767)
964  {
965  // When the contents of a received Duration/ID field, treated as an unsigned
966  // integer, are greater than 32 768, the contents are interpreted as appropriate
967  // for the frame type and subtype or ignored if the receiving MAC entity does
968  // not have a defined interpretation for that type and subtype (IEEE 802.11-2016
969  // sec. 10.27.3)
970  return;
971  }
972 
973  Time duration = psdu->GetDuration ();
974  NS_LOG_DEBUG ("Duration/ID=" << duration);
975 
976  if (psdu->GetAddr1 () == m_self)
977  {
978  // When the received frame’s RA is equal to the STA’s own MAC address, the STA
979  // shall not update its NAV (IEEE 802.11-2016, sec. 10.3.2.4)
980  return;
981  }
982 
983  // For all other received frames the STA shall update its NAV when the received
984  // Duration is greater than the STA’s current NAV value (IEEE 802.11-2016 sec. 10.3.2.4)
985  Time navEnd = Simulator::Now () + duration;
986  if (navEnd > m_navEnd)
987  {
988  m_navEnd = navEnd;
989  NS_LOG_DEBUG ("Updated NAV=" << m_navEnd);
990 
991  // A STA that used information from an RTS frame as the most recent basis to update
992  // its NAV setting is permitted to reset its NAV if no PHY-RXSTART.indication
993  // primitive is received from the PHY during a NAVTimeout period starting when the
994  // MAC receives a PHY-RXEND.indication primitive corresponding to the detection of
995  // the RTS frame. NAVTimeout period is equal to:
996  // (2 x aSIFSTime) + (CTS_Time) + aRxPHYStartDelay + (2 x aSlotTime)
997  // The “CTS_Time” shall be calculated using the length of the CTS frame and the data
998  // rate at which the RTS frame used for the most recent NAV update was received
999  // (IEEE 802.11-2016 sec. 10.3.2.4)
1000  if (psdu->GetHeader (0).IsRts ())
1001  {
1002  Time navResetDelay = 2 * m_phy->GetSifs ()
1003  + WifiPhy::CalculateTxDuration (GetCtsSize (), txVector,
1004  m_phy->GetPhyBand ())
1006  + 2 * m_phy->GetSlot ();
1008  }
1009  }
1010  NS_LOG_DEBUG ("Current NAV=" << m_navEnd);
1011 
1012  m_channelAccessManager->NotifyNavStartNow (duration);
1013 }
1014 
1015 void
1017 {
1018  NS_LOG_FUNCTION (this);
1019  m_navEnd = Simulator::Now ();
1020  m_channelAccessManager->NotifyNavResetNow (Seconds (0));
1021 }
1022 
1023 void
1025  const WifiTxVector& txVector, bool inAmpdu)
1026 {
1027  NS_LOG_FUNCTION (this << *mpdu << rxSignalInfo << txVector << inAmpdu);
1028  // The received MPDU is either broadcast or addressed to this station
1029  NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsGroup ()
1030  || mpdu->GetHeader ().GetAddr1 () == m_self);
1031 
1032  double rxSnr = rxSignalInfo.snr;
1033  const WifiMacHeader& hdr = mpdu->GetHeader ();
1034 
1035  if (hdr.IsCtl ())
1036  {
1037  if (hdr.IsRts ())
1038  {
1039  NS_ABORT_MSG_IF (inAmpdu, "Received RTS as part of an A-MPDU");
1040 
1041  // A non-VHT STA that is addressed by an RTS frame behaves as follows:
1042  // - If the NAV indicates idle, the STA shall respond with a CTS frame after a SIFS
1043  // - Otherwise, the STA shall not respond with a CTS frame
1044  // (IEEE 802.11-2016 sec. 10.3.2.7)
1045  if (m_navEnd <= Simulator::Now ())
1046  {
1047  NS_LOG_DEBUG ("Received RTS from=" << hdr.GetAddr2 () << ", schedule CTS");
1049  this, hdr, txVector.GetMode (), rxSnr);
1050  }
1051  else
1052  {
1053  NS_LOG_DEBUG ("Received RTS from=" << hdr.GetAddr2 () << ", cannot schedule CTS");
1054  }
1055  }
1056  else if (hdr.IsCts () && m_txTimer.IsRunning () && m_txTimer.GetReason () == WifiTxTimer::WAIT_CTS
1057  && m_mpdu != 0)
1058  {
1059  NS_ABORT_MSG_IF (inAmpdu, "Received CTS as part of an A-MPDU");
1060  NS_ASSERT (hdr.GetAddr1 () == m_self);
1061 
1062  Mac48Address sender = m_mpdu->GetHeader ().GetAddr1 ();
1063  NS_LOG_DEBUG ("Received CTS from=" << sender);
1064 
1065  SnrTag tag;
1066  mpdu->GetPacket ()->PeekPacketTag (tag);
1067  m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxSignalInfo, txVector);
1068  m_mac->GetWifiRemoteStationManager ()->ReportRtsOk (m_mpdu->GetHeader (),
1069  rxSnr, txVector.GetMode (), tag.Get ());
1070 
1071  m_txTimer.Cancel ();
1072  m_channelAccessManager->NotifyCtsTimeoutResetNow ();
1074  }
1075  else if (hdr.IsAck () && m_mpdu != 0 && m_txTimer.IsRunning ()
1077  {
1078  NS_ASSERT (hdr.GetAddr1 () == m_self);
1079  SnrTag tag;
1080  mpdu->GetPacket ()->PeekPacketTag (tag);
1081  ReceivedNormalAck (m_mpdu, m_txParams.m_txVector, txVector, rxSignalInfo, tag.Get ());
1082  m_mpdu = 0;
1083  }
1084  }
1085  else if (hdr.IsMgt ())
1086  {
1087  NS_ABORT_MSG_IF (inAmpdu, "Received management frame as part of an A-MPDU");
1088 
1089  if (hdr.IsBeacon () || hdr.IsProbeResp ())
1090  {
1091  // Apply SNR tag for beacon quality measurements
1092  SnrTag tag;
1093  tag.Set (rxSnr);
1094  Ptr<Packet> packet = mpdu->GetPacket ()->Copy ();
1095  packet->AddPacketTag (tag);
1096  mpdu = Create<WifiMacQueueItem> (packet, hdr);
1097  }
1098 
1099  if (hdr.GetAddr1 () == m_self)
1100  {
1101  NS_LOG_DEBUG ("Received " << hdr.GetTypeString () << " from=" << hdr.GetAddr2 () << ", schedule ACK");
1103  this, hdr, txVector, rxSnr);
1104  }
1105 
1106  m_rxMiddle->Receive (mpdu);
1107  }
1108  else if (hdr.IsData () && !hdr.IsQosData ())
1109  {
1110  if (hdr.GetAddr1 () == m_self)
1111  {
1112  NS_LOG_DEBUG ("Received " << hdr.GetTypeString () << " from=" << hdr.GetAddr2 () << ", schedule ACK");
1114  this, hdr, txVector, rxSnr);
1115  }
1116 
1117  m_rxMiddle->Receive (mpdu);
1118  }
1119 }
1120 
1121 void
1123  const WifiTxVector& ackTxVector, const RxSignalInfo& rxInfo,
1124  double snr)
1125 {
1126  Mac48Address sender = mpdu->GetHeader ().GetAddr1 ();
1127  NS_LOG_DEBUG ("Received ACK from=" << sender);
1128 
1129  NotifyReceivedNormalAck (mpdu);
1130 
1131  // When fragmentation is used, only update manager when the last fragment is acknowledged
1132  if (!mpdu->GetHeader ().IsMoreFragments ())
1133  {
1134  m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxInfo, ackTxVector);
1135  m_mac->GetWifiRemoteStationManager ()->ReportDataOk (mpdu, rxInfo.snr, ackTxVector.GetMode (),
1136  snr, txVector);
1137  }
1138  // cancel the timer
1139  m_txTimer.Cancel ();
1140  m_channelAccessManager->NotifyAckTimeoutResetNow ();
1141 
1142  // The CW shall be reset to aCWmin after every successful attempt to transmit
1143  // a frame containing all or part of an MSDU or MMPDU (sec. 10.3.3 of 802.11-2016)
1144  m_dcf->ResetCw ();
1145 
1146  if (mpdu->GetHeader ().IsMoreFragments ())
1147  {
1148  // replace the current fragment with the next one
1149  m_dcf->GetWifiMacQueue ()->Replace (mpdu, GetNextFragment ());
1150  m_moreFragments = true;
1151  }
1152  else
1153  {
1154  // the MPDU has been acknowledged, we can now dequeue it if it is stored in a queue
1155  DequeueMpdu (mpdu);
1156  }
1157 
1159 }
1160 
1161 void
1163 {
1164  NS_LOG_FUNCTION (this << *mpdu);
1165 
1166  // inform the MAC that the transmission was successful
1167  if (!m_ackedMpduCallback.IsNull ())
1168  {
1169  m_ackedMpduCallback (mpdu);
1170  }
1171 }
1172 
1173 void
1175  const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus)
1176 {
1177  NS_ASSERT_MSG (false, "A non-QoS station should not receive an A-MPDU");
1178 }
1179 
1180 } //namespace ns3
ns3::FrameExchangeManager::CalculateAcknowledgmentTime
virtual void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const
Calculate the time required to acknowledge a frame according to the given acknowledgment method.
Definition: frame-exchange-manager.cc:487
ns3::TypeId
a unique identifier for an interface.
Definition: type-id.h:59
ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck
virtual void RetransmitMpduAfterMissedAck(Ptr< WifiMacQueueItem > mpdu) const
Retransmit an MPDU that was not acknowledged.
Definition: frame-exchange-manager.cc:795
NS_LOG_COMPONENT_DEFINE
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
ns3::FrameExchangeManager::SetChannelAccessManager
virtual void SetChannelAccessManager(const Ptr< ChannelAccessManager > channelAccessManager)
Set the channel access manager to use.
Definition: frame-exchange-manager.cc:151
ns3::WifiAcknowledgment::acknowledgmentTime
Time acknowledgmentTime
time required by the acknowledgment method
Definition: wifi-acknowledgment.h:104
ns3::FrameExchangeManager::m_txTimer
WifiTxTimer m_txTimer
the timer set upon frame transmission
Definition: frame-exchange-manager.h:379
ns3::WifiMacHeader::IsRts
bool IsRts(void) const
Return true if the header is a RTS header.
Definition: wifi-mac-header.cc:651
NS_OBJECT_ENSURE_REGISTERED
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
NS_ASSERT
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
ns3::WifiMacQueueItem::GetPacket
Ptr< const Packet > GetPacket(void) const
Get the packet stored in this item.
Definition: wifi-mac-queue-item.cc:66
ns3::WifiMacHeader::SetNoMoreFragments
void SetNoMoreFragments(void)
Un-set the More Fragment bit in the Frame Control Field.
Definition: wifi-mac-header.cc:322
ns3::FrameExchangeManager::ReceiveMpdu
virtual void ReceiveMpdu(Ptr< WifiMacQueueItem > mpdu, RxSignalInfo rxSignalInfo, const WifiTxVector &txVector, bool inAmpdu)
This method handles the reception of an MPDU (possibly included in an A-MPDU)
Definition: frame-exchange-manager.cc:1024
ns3::FrameExchangeManager::m_phy
Ptr< WifiPhy > m_phy
the PHY layer on this station
Definition: frame-exchange-manager.h:385
ns3::FrameExchangeManager::NotifyInternalCollision
virtual void NotifyInternalCollision(Ptr< Txop > txop)
Notify that an internal collision has occurred for the given Txop.
Definition: frame-exchange-manager.cc:842
ns3::WifiMacHeader::SetDuration
void SetDuration(Time duration)
Set the Duration/ID field with the given duration (Time object).
Definition: wifi-mac-header.cc:300
ns3::WifiMacHeader::SetMoreFragments
void SetMoreFragments(void)
Set the More Fragment bit in the Frame Control field.
Definition: wifi-mac-header.cc:327
ns3::FrameExchangeManager::m_moreFragments
bool m_moreFragments
true if a fragment has to be sent after a SIFS
Definition: frame-exchange-manager.h:549
ns3::WifiMacHeader::IsAck
bool IsAck(void) const
Return true if the header is an Ack header.
Definition: wifi-mac-header.cc:663
ns3::GetRtsSize
uint32_t GetRtsSize(void)
Return the total RTS size (including FCS trailer).
Definition: wifi-utils.cc:100
ns3::WifiMacHeader::GetSize
uint32_t GetSize(void) const
Return the size of the WifiMacHeader in octets.
Definition: wifi-mac-header.cc:933
ns3::WifiPsdu::GetAddr1
Mac48Address GetAddr1(void) const
Get the Receiver Address (RA), which is common to all the MPDUs.
Definition: wifi-psdu.cc:111
min
#define min(a, b)
Definition: 80211b.c:42
ns3::FrameExchangeManager::ResetPhy
virtual void ResetPhy(void)
Remove WifiPhy associated with this FrameExchangeManager.
Definition: frame-exchange-manager.cc:168
ns3::FrameExchangeManager::GetRtsDurationId
virtual Time GetRtsDurationId(const WifiTxVector &rtsTxVector, Time txDuration, Time response) const
Compute how to set the Duration/ID field of an RTS frame to send to protect a frame transmitted with ...
Definition: frame-exchange-manager.cc:548
ns3::FrameExchangeManager::SendNormalAck
void SendNormalAck(const WifiMacHeader &hdr, const WifiTxVector &dataTxVector, double dataSnr)
Send Normal Ack.
Definition: frame-exchange-manager.cc:678
ns3::WifiAcknowledgment::NONE
@ NONE
Definition: wifi-acknowledgment.h:52
ns3::WifiPsdu::GetDuration
Time GetDuration(void) const
Get the duration from the Duration/ID field, which is common to all the MPDUs.
Definition: wifi-psdu.cc:141
ns3::Mac48Address::IsGroup
bool IsGroup(void) const
Definition: mac48-address.cc:164
ns3::WifiMacHeader::IsBeacon
bool IsBeacon(void) const
Return true if the header is a Beacon header.
Definition: wifi-mac-header.cc:705
ns3::WifiMacHeader::IsData
bool IsData(void) const
Return true if the Type is DATA.
Definition: wifi-mac-header.cc:558
ns3::Packet::GetSize
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
ns3::Txop::NotifyChannelReleased
virtual void NotifyChannelReleased(void)
Called by the FrameExchangeManager to notify the completion of the transmissions.
Definition: txop.cc:355
ns3::FrameExchangeManager::SetMacTxMiddle
virtual void SetMacTxMiddle(const Ptr< MacTxMiddle > txMiddle)
Set the MAC TX Middle to use.
Definition: frame-exchange-manager.cc:137
ns3::WifiPhy::GetSlot
Time GetSlot(void) const
Return the slot duration for this PHY.
Definition: wifi-phy.cc:923
ns3::Callback< void, WifiMacDropReason, Ptr< const WifiMacQueueItem > >
ns3::WifiTxParameters::m_txDuration
Time m_txDuration
TX duration of the frame.
Definition: wifi-tx-parameters.h:65
ns3::WifiRtsCtsProtection
WifiRtsCtsProtection specifies that RTS/CTS protection method is used.
Definition: wifi-protection.h:96
ns3::WifiProtection::method
const Method method
protection method
Definition: wifi-protection.h:71
ns3::WifiTxParameters::GetPsduInfoMap
const PsduInfoMap & GetPsduInfoMap(void) const
Get a const reference to the map containing information about PSDUs.
Definition: wifi-tx-parameters.cc:92
ns3::Packet::CreateFragment
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
Definition: packet.cc:227
ns3::WifiMacHeader::SetFragmentNumber
void SetFragmentNumber(uint8_t frag)
Set the fragment number of the header.
Definition: wifi-mac-header.cc:317
ns3::Simulator::Now
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
ns3::WifiMacHeader::IsRetry
bool IsRetry(void) const
Return if the Retry bit is set.
Definition: wifi-mac-header.cc:789
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::WifiMacHeader::SetRetry
void SetRetry(void)
Set the Retry bit in the Frame Control field.
Definition: wifi-mac-header.cc:342
ns3::WifiPhy::CalculateTxDuration
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
Definition: wifi-phy.cc:1611
ns3::WIFI_MAC_FCS_LENGTH
static const uint16_t WIFI_MAC_FCS_LENGTH
The length in octects of the IEEE 802.11 MAC FCS field.
Definition: wifi-mac-trailer.h:31
ns3::WifiMacHeader::SetSequenceNumber
void SetSequenceNumber(uint16_t seq)
Set the sequence number of the header.
Definition: wifi-mac-header.cc:312
ns3::FrameExchangeManager::SetAckManager
virtual void SetAckManager(Ptr< WifiAckManager > ackManager)
Set the Acknowledgment Manager to use.
Definition: frame-exchange-manager.cc:117
ns3::Callback::IsNull
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1386
ns3::WifiProtection::CTS_TO_SELF
@ CTS_TO_SELF
Definition: wifi-protection.h:49
ns3::WifiMacHeader::IsProbeResp
bool IsProbeResp(void) const
Return true if the header is a Probe Response header.
Definition: wifi-mac-header.cc:699
ns3::ObjectBase::TraceDisconnectWithoutContext
bool TraceDisconnectWithoutContext(std::string name, const CallbackBase &cb)
Disconnect from a TraceSource a Callback previously connected without a context.
Definition: object-base.cc:319
ns3::WifiTxTimer::IsRunning
bool IsRunning(void) const
Return true if the timer is running.
Definition: wifi-tx-timer.cc:121
ns3::FrameExchangeManager::CalculateProtectionTime
virtual void CalculateProtectionTime(WifiProtection *protection) const
Calculate the time required to protect a frame according to the given protection method.
Definition: frame-exchange-manager.cc:458
ns3::FrameExchangeManager::m_protectionManager
Ptr< WifiProtectionManager > m_protectionManager
Protection manager.
Definition: frame-exchange-manager.h:550
snr-tag.h
ns3::WIFI_MAC_DROP_REACHED_RETRY_LIMIT
@ WIFI_MAC_DROP_REACHED_RETRY_LIMIT
Definition: wifi-mac.h:58
ns3::FrameExchangeManager::SendCtsToSelf
void SendCtsToSelf(const WifiTxParameters &txParams)
Send CTS for a CTS-to-self mechanism.
Definition: frame-exchange-manager.cc:651
ns3::WifiMacHeader::SetDsNotFrom
void SetDsNotFrom(void)
Un-set the From DS bit in the Frame Control field.
Definition: wifi-mac-header.cc:90
ns3::WifiMacHeader::NO_ACK
@ NO_ACK
Definition: wifi-mac-header.h:93
ns3::FrameExchangeManager::NavResetTimeout
virtual void NavResetTimeout(void)
Reset the NAV upon expiration of the NAV reset timer.
Definition: frame-exchange-manager.cc:1016
ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
Definition: wifi-phy.cc:1605
ns3::FrameExchangeManager::UpdateNav
virtual void UpdateNav(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
Update the NAV, if needed, based on the Duration/ID of the given psdu.
Definition: frame-exchange-manager.cc:959
ns3::WifiTxParameters::GetSize
uint32_t GetSize(Mac48Address receiver) const
Get the size in bytes of the (A-)MPDU addressed to the given receiver.
Definition: wifi-tx-parameters.cc:227
ns3::Time::US
@ US
microsecond
Definition: nstime.h:117
ns3::WifiMacQueueItem::GetQueueAc
AcIndex GetQueueAc(void) const
Get the AC of the queue this item is stored into.
Definition: wifi-mac-queue-item.cc:218
ns3::Time::IsStrictlyPositive
bool IsStrictlyPositive(void) const
Exactly equivalent to t > 0.
Definition: nstime.h:333
ns3::FrameExchangeManager::m_channelAccessManager
Ptr< ChannelAccessManager > m_channelAccessManager
the channel access manager
Definition: frame-exchange-manager.h:384
ns3::Txop::ResetCw
void ResetCw(void)
Update the value of the CW variable to take into account a transmission success or a transmission abo...
Definition: txop.cc:191
ns3::WifiMacHeader::IsCts
bool IsCts(void) const
Return true if the header is a CTS header.
Definition: wifi-mac-header.cc:657
ns3::FrameExchangeManager::GetNextFragment
Ptr< WifiMacQueueItem > GetNextFragment(void)
Get the next fragment of the current MSDU.
Definition: frame-exchange-manager.cc:712
ns3::Mac48Address
an EUI-48 address
Definition: mac48-address.h:44
ns3::WifiMacHeader::SetNoRetry
void SetNoRetry(void)
Un-set the Retry bit in the Frame Control field.
Definition: wifi-mac-header.cc:347
ns3::WifiRtsCtsProtection::ctsTxVector
WifiTxVector ctsTxVector
CTS TXVECTOR.
Definition: wifi-protection.h:103
ns3::FrameExchangeManager::SetProtectionManager
virtual void SetProtectionManager(Ptr< WifiProtectionManager > protectionManager)
Set the Protection Manager to use.
Definition: frame-exchange-manager.cc:104
ns3::WifiTxVector
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Definition: wifi-tx-vector.h:71
ns3::FrameExchangeManager::CtsTimeout
virtual void CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector)
Called when the CTS timeout expires.
Definition: frame-exchange-manager.cc:801
ns3::FrameExchangeManager::NotifyOffNow
void NotifyOffNow(void)
This method is typically invoked by the PhyListener to notify the MAC layer that the device has been ...
Definition: frame-exchange-manager.cc:900
ns3::WifiMacQueueItem::GetPacketSize
uint32_t GetPacketSize(void) const
Return the size in bytes of the packet or control header or management header stored by this item.
Definition: wifi-mac-queue-item.cc:96
ns3::WifiMacHeader::GetAddr1
Mac48Address GetAddr1(void) const
Return the address in the Address 1 field.
Definition: wifi-mac-header.cc:424
third.mac
mac
Definition: third.py:99
ns3::Time::As
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:429
ns3::WIFI_MAC_CTL_CTS
@ WIFI_MAC_CTL_CTS
Definition: wifi-mac-header.h:41
ns3::WifiPhy::SetReceiveOkCallback
void SetReceiveOkCallback(RxOkCallback callback)
Definition: wifi-phy.cc:636
ns3::FrameExchangeManager::m_self
Mac48Address m_self
the MAC address of this device
Definition: frame-exchange-manager.h:386
ns3::FrameExchangeManager::GetCtsToSelfDurationId
virtual Time GetCtsToSelfDurationId(const WifiTxVector &ctsTxVector, Time txDuration, Time response) const
Compute how to set the Duration/ID field of a CTS-to-self frame to send to protect a frame transmitte...
Definition: frame-exchange-manager.cc:642
ns3::Packet::PeekPacketTag
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
Definition: packet.cc:978
ns3::WifiTxParameters
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism,...
Definition: wifi-tx-parameters.h:45
ns3::FrameExchangeManager::SetMacRxMiddle
virtual void SetMacRxMiddle(const Ptr< MacRxMiddle > rxMiddle)
Set the MAC RX Middle to use.
Definition: frame-exchange-manager.cc:144
ns3::Simulator::Schedule
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:556
ns3::WifiMacHeader::GetSequenceControl
uint16_t GetSequenceControl(void) const
Return the raw Sequence Control field.
Definition: wifi-mac-header.cc:771
ns3::FrameExchangeManager::NotifySleepNow
void NotifySleepNow(void)
This method is typically invoked by the PhyListener to notify the MAC layer that the device has been ...
Definition: frame-exchange-manager.cc:893
ns3::FrameExchangeManager::m_ackedMpduCallback
AckedMpdu m_ackedMpduCallback
the acknowledged MPDU callback
Definition: frame-exchange-manager.h:391
ns3::WifiMacQueueItem::GetHeader
const WifiMacHeader & GetHeader(void) const
Get the header stored in this item.
Definition: wifi-mac-queue-item.cc:72
ns3::Txop::NotifyChannelAccessed
virtual void NotifyChannelAccessed(Time txopDuration=Seconds(0))
Called by the FrameExchangeManager to notify that channel access has been granted for the given amoun...
Definition: txop.cc:348
ns3::TypeId::SetParent
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
ns3::Txop::UpdateFailedCw
void UpdateFailedCw(void)
Update the value of the CW variable to take into account a transmission failure.
Definition: txop.cc:199
ns3::WifiNormalAck::ackTxVector
WifiTxVector ackTxVector
Ack TXVECTOR.
Definition: wifi-acknowledgment.h:152
ns3::FrameExchangeManager::m_droppedMpduCallback
DroppedMpdu m_droppedMpduCallback
the dropped MPDU callback
Definition: frame-exchange-manager.h:390
ns3::WifiTxParameters::m_protection
std::unique_ptr< WifiProtection > m_protection
protection method
Definition: wifi-tx-parameters.h:63
ns3::MakeNullCallback
Callback< R, Ts... > MakeNullCallback(void)
Definition: callback.h:1682
ns3::FrameExchangeManager::DoSendCtsAfterRts
void DoSendCtsAfterRts(const WifiMacHeader &rtsHdr, WifiTxVector &ctsTxVector, double rtsSnr)
Send CTS after receiving RTS.
Definition: frame-exchange-manager.cc:601
ns3::FrameExchangeManager::SetAckedMpduCallback
void SetAckedMpduCallback(AckedMpdu callback)
Set the callback to invoke when an MPDU is successfully acked.
Definition: frame-exchange-manager.cc:198
wifi-mac-queue.h
ns3::FrameExchangeManager::NotifyPacketDiscarded
virtual void NotifyPacketDiscarded(Ptr< const WifiMacQueueItem > mpdu)
Pass the given MPDU, discarded because of the max retry limit was reached, to the MPDU dropped callba...
Definition: frame-exchange-manager.cc:223
ns3::WifiMacHeader::SetAddr1
void SetAddr1(Mac48Address address)
Fill the Address 1 field with the given address.
Definition: wifi-mac-header.cc:108
ns3::FrameExchangeManager::GetFirstFragmentIfNeeded
Ptr< WifiMacQueueItem > GetFirstFragmentIfNeeded(Ptr< WifiMacQueueItem > mpdu)
Fragment the given MPDU if needed.
Definition: frame-exchange-manager.cc:317
ns3::FrameExchangeManager::GetProtectionManager
Ptr< WifiProtectionManager > GetProtectionManager(void) const
Get the Protection Manager used by this node.
Definition: frame-exchange-manager.cc:111
ns3::WifiMacHeader::GetTypeString
const char * GetTypeString(void) const
Return a string corresponds to the header type.
Definition: wifi-mac-header.cc:977
ns3::GetAckSize
uint32_t GetAckSize(void)
Return the total Ack size (including FCS trailer).
Definition: wifi-utils.cc:55
ns3::WifiMacHeader
Implements the IEEE 802.11 MAC header.
Definition: wifi-mac-header.h:85
ns3::FrameExchangeManager::SendRts
void SendRts(const WifiTxParameters &txParams)
Send RTS to begin RTS-CTS-Data-Ack transaction.
Definition: frame-exchange-manager.cc:561
ns3::Ptr
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
ns3::FrameExchangeManager::TransmissionSucceeded
virtual void TransmissionSucceeded(void)
Take necessary actions upon a transmission success.
Definition: frame-exchange-manager.cc:738
ns3::FrameExchangeManager::Receive
void Receive(Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > perMpduStatus)
This method is intended to be called by the PHY layer every time an MPDU is received and also when th...
Definition: frame-exchange-manager.cc:907
ns3::WifiCtsToSelfProtection::ctsTxVector
WifiTxVector ctsTxVector
CTS TXVECTOR.
Definition: wifi-protection.h:119
ns3::EventId::IsRunning
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
Definition: event-id.cc:71
ns3::FrameExchangeManager::m_txParams
WifiTxParameters m_txParams
the TX parameters for the current frame
Definition: frame-exchange-manager.h:547
ns3::WifiMode
represent a single transmission mode
Definition: wifi-mode.h:48
ns3::NanoSeconds
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1313
ns3::FrameExchangeManager::IsPromisc
bool IsPromisc(void) const
Check if the device is operating in promiscuous mode.
Definition: frame-exchange-manager.cc:211
ns3::FrameExchangeManager::SetWifiMac
virtual void SetWifiMac(const Ptr< RegularWifiMac > mac)
Set the MAC layer to use.
Definition: frame-exchange-manager.cc:130
ns3::Object
A base class which provides memory management and object aggregation.
Definition: object.h:88
ns3::WifiTxTimer::Reschedule
void Reschedule(const Time &delay)
Reschedule the timer to time out the given amount of time from the moment this function is called.
Definition: wifi-tx-timer.cc:47
ns3::FrameExchangeManager::SetDroppedMpduCallback
virtual void SetDroppedMpduCallback(DroppedMpdu callback)
Set the callback to invoke when an MPDU is dropped.
Definition: frame-exchange-manager.cc:191
ns3::FrameExchangeManager::GetTxDuration
virtual Time GetTxDuration(uint32_t ppduPayloadSize, Mac48Address receiver, const WifiTxParameters &txParams) const
Get the updated TX duration of the frame associated with the given TX parameters if the size of the P...
Definition: frame-exchange-manager.cc:507
ns3::WifiProtection::NONE
@ NONE
Definition: wifi-protection.h:47
ns3::FrameExchangeManager::SetAddress
virtual void SetAddress(Mac48Address address)
Set the MAC address.
Definition: frame-exchange-manager.cc:177
ns3::WifiProtection::protectionTime
Time protectionTime
time required by the protection method
Definition: wifi-protection.h:72
ns3::FrameExchangeManager::m_rxMiddle
Ptr< MacRxMiddle > m_rxMiddle
the MAC RX Middle on this station
Definition: frame-exchange-manager.h:383
ns3::WifiPsdu::GetHeader
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
Definition: wifi-psdu.cc:266
ns3::WifiTxTimer::WAIT_NORMAL_ACK
@ WAIT_NORMAL_ACK
Definition: wifi-tx-timer.h:58
frame-exchange-manager.h
ns3::EventId::Cancel
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Definition: event-id.cc:53
ns3::Txop::GetWifiMacQueue
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
Definition: txop.cc:154
ns3::WifiNormalAck
WifiNormalAck specifies that acknowledgment via Normal Ack is required.
Definition: wifi-acknowledgment.h:145
ns3::WifiTxParameters::Clear
void Clear(void)
Reset the TX parameters.
Definition: wifi-tx-parameters.cc:67
ns3::WifiRtsCtsProtection::rtsTxVector
WifiTxVector rtsTxVector
RTS TXVECTOR.
Definition: wifi-protection.h:102
ns3::WifiPsdu::GetNMpdus
std::size_t GetNMpdus(void) const
Return the number of MPDUs constituting the PSDU.
Definition: wifi-psdu.cc:319
ns3::WifiMacHeader::IsQosData
bool IsQosData(void) const
Return true if the Type is DATA and Subtype is one of the possible values for QoS Data.
Definition: wifi-mac-header.cc:565
ns3::FrameExchangeManager::m_mpdu
Ptr< WifiMacQueueItem > m_mpdu
the MPDU being transmitted
Definition: frame-exchange-manager.h:546
first.address
address
Definition: first.py:44
ns3::WifiPhy::GetPhyBand
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:1125
ns3::FrameExchangeManager::SetWifiPhy
virtual void SetWifiPhy(const Ptr< WifiPhy > phy)
Set the PHY layer to use.
Definition: frame-exchange-manager.cc:158
ns3::Time
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
ns3::FrameExchangeManager::SetPromisc
void SetPromisc(void)
Enable promiscuous mode.
Definition: frame-exchange-manager.cc:205
ns3::WifiAcknowledgment::NORMAL_ACK
@ NORMAL_ACK
Definition: wifi-acknowledgment.h:53
NS_ABORT_MSG_IF
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
ns3::Txop::IsQosTxop
virtual bool IsQosTxop() const
Check for QoS TXOP.
Definition: txop.cc:419
NS_ASSERT_MSG
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
ns3::WifiProtection
WifiProtection is an abstract base struct.
Definition: wifi-protection.h:40
ns3::FrameExchangeManager::Reset
virtual void Reset(void)
Reset this frame exchange manager.
Definition: frame-exchange-manager.cc:68
ns3::SnrTag::Set
void Set(double snr)
Set the SNR to the given value.
Definition: snr-tag.cc:83
ns3::WifiMacHeader::GetQosAckPolicy
QosAckPolicy GetQosAckPolicy(void) const
Return the QoS Ack policy in the QoS control field.
Definition: wifi-mac-header.cc:829
ns3::WifiMacHeader::GetFragmentNumber
uint8_t GetFragmentNumber(void) const
Return the fragment number of the header.
Definition: wifi-mac-header.cc:783
ns3::FrameExchangeManager::GetFrameDurationId
virtual Time GetFrameDurationId(const WifiMacHeader &header, uint32_t size, const WifiTxParameters &txParams, Ptr< Packet > fragmentedPacket) const
Compute how to set the Duration/ID field of a frame being transmitted with the given TX parameters.
Definition: frame-exchange-manager.cc:520
ns3::WIFI_MAC_CTL_ACK
@ WIFI_MAC_CTL_ACK
Definition: wifi-mac-header.h:42
ns3::FrameExchangeManager::m_navEnd
Time m_navEnd
NAV expiration time.
Definition: frame-exchange-manager.h:388
ns3::FrameExchangeManager::GetAckManager
Ptr< WifiAckManager > GetAckManager(void) const
Get the Acknowledgment Manager used by this node.
Definition: frame-exchange-manager.cc:124
ns3::WifiTxParameters::m_acknowledgment
std::unique_ptr< WifiAcknowledgment > m_acknowledgment
acknowledgment method
Definition: wifi-tx-parameters.h:64
ns3::SnrTag
Introspection did not find any typical Config paths.
Definition: snr-tag.h:35
ns3::FrameExchangeManager::DequeueMpdu
virtual void DequeueMpdu(Ptr< const WifiMacQueueItem > mpdu)
Dequeue the given MPDU from the queue in which it is stored.
Definition: frame-exchange-manager.cc:447
ns3::FrameExchangeManager::StartTransmission
virtual bool StartTransmission(Ptr< Txop > dcf)
Request the FrameExchangeManager to start a frame exchange sequence.
Definition: frame-exchange-manager.cc:259
ns3::WifiMacHeader::IsMgt
bool IsMgt(void) const
Return true if the Type is Management.
Definition: wifi-mac-header.cc:577
ns3::MakeCallback
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1642
ns3::WifiAckManager::SetQosAckPolicy
static void SetQosAckPolicy(Ptr< WifiMacQueueItem > item, const WifiAcknowledgment *acknowledgment)
Set the QoS Ack policy for the given MPDU, which must be a QoS data frame.
Definition: wifi-ack-manager.cc:64
ns3::Packet::AddPacketTag
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Definition: packet.cc:956
ns3::FrameExchangeManager::m_navResetEvent
EventId m_navResetEvent
the event to reset the NAV after an RTS
Definition: frame-exchange-manager.h:380
ns3::WifiMacHeader::SetAddr2
void SetAddr2(Mac48Address address)
Fill the Address 2 field with the given address.
Definition: wifi-mac-header.cc:114
ns3::FrameExchangeManager::NotifySwitchingStartNow
void NotifySwitchingStartNow(Time duration)
Definition: frame-exchange-manager.cc:885
NS_LOG_FUNCTION_NOARGS
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
Definition: log-macros-enabled.h:209
ns3::Time::Min
static Time Min()
Minimum representable Time Not to be confused with Min(Time,Time).
Definition: nstime.h:274
ns3::FrameExchangeManager::m_ackManager
Ptr< WifiAckManager > m_ackManager
Acknowledgment manager.
Definition: frame-exchange-manager.h:551
ns3::Time::IsStrictlyNegative
bool IsStrictlyNegative(void) const
Exactly equivalent to t < 0.
Definition: nstime.h:325
timeout
ns3::Time timeout
Definition: openflow-switch.cc:52
ns3::FrameExchangeManager::UpdateTxDuration
void UpdateTxDuration(Mac48Address receiver, WifiTxParameters &txParams) const
Update the TX duration field of the given TX parameters after that the PSDU addressed to the given re...
Definition: frame-exchange-manager.cc:514
ns3::WifiMacQueueItem::IsQueued
bool IsQueued(void) const
Return true if this item is stored in some queue, false otherwise.
Definition: wifi-mac-queue-item.cc:212
ns3::FrameExchangeManager::m_txMiddle
Ptr< MacTxMiddle > m_txMiddle
the MAC TX Middle on this station
Definition: frame-exchange-manager.h:382
ns3::RxSignalInfo::snr
double snr
SNR in linear scale.
Definition: phy-entity.h:68
NS_LOG_DEBUG
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
ns3::WifiTxParameters::m_txVector
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
Definition: wifi-tx-parameters.h:62
wifi-utils.h
ns3::WifiMacQueueItem::GetTimeStamp
Time GetTimeStamp(void) const
Get the timestamp included in this item.
Definition: wifi-mac-queue-item.cc:90
ns3::RxSignalInfo
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:67
ns3::Seconds
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
ns3::FrameExchangeManager::m_promisc
bool m_promisc
Flag if the device is operating in promiscuous mode.
Definition: frame-exchange-manager.h:389
ns3::WifiAcknowledgment
WifiAcknowledgment is an abstract base struct.
Definition: wifi-acknowledgment.h:45
ns3::Packet::Copy
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
ns3::FrameExchangeManager::NotifyReceivedNormalAck
virtual void NotifyReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu)
Notify other components that an MPDU was acknowledged.
Definition: frame-exchange-manager.cc:1162
ns3::FrameExchangeManager::SendMpduWithProtection
void SendMpduWithProtection(Ptr< WifiMacQueueItem > mpdu, WifiTxParameters &txParams)
Send an MPDU with the given TX parameters (with the specified protection).
Definition: frame-exchange-manager.cc:342
ns3::FrameExchangeManager::m_mac
Ptr< RegularWifiMac > m_mac
the MAC layer on this station
Definition: frame-exchange-manager.h:381
ns3::FrameExchangeManager::m_bssid
Mac48Address m_bssid
BSSID address (Mac48Address)
Definition: frame-exchange-manager.h:387
ns3::SnrTag::Get
double Get(void) const
Return the SNR value.
Definition: snr-tag.cc:89
ns3::WifiTxTimer::WAIT_CTS
@ WAIT_CTS
Definition: wifi-tx-timer.h:57
ns3::WifiMacHeader::GetRawDuration
uint16_t GetRawDuration(void) const
Return the raw duration from the Duration/ID field.
Definition: wifi-mac-header.cc:759
NS_LOG_FUNCTION
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Definition: log-macros-enabled.h:244
ns3::FrameExchangeManager::TransmissionFailed
virtual void TransmissionFailed(void)
Take necessary actions upon a transmission failure.
Definition: frame-exchange-manager.cc:758
ns3::WifiMacHeader::GetDuration
Time GetDuration(void) const
Return the duration from the Duration/ID field (Time object).
Definition: wifi-mac-header.cc:765
ns3::WifiMacHeader::IsMoreFragments
bool IsMoreFragments(void) const
Return if the More Fragment bit is set.
Definition: wifi-mac-header.cc:795
ns3::FrameExchangeManager::ForwardMpduDown
virtual void ForwardMpduDown(Ptr< WifiMacQueueItem > mpdu, WifiTxVector &txVector)
Forward an MPDU down to the PHY layer.
Definition: frame-exchange-manager.cc:439
ns3::FrameExchangeManager::DoDispose
void DoDispose() override
Destructor implementation.
Definition: frame-exchange-manager.cc:83
ns3::WifiTxTimer::GetReason
Reason GetReason(void) const
Get the reason why the timer was started.
Definition: wifi-tx-timer.cc:87
ns3::WifiMacHeader::IsCtl
bool IsCtl(void) const
Return true if the Type is Control.
Definition: wifi-mac-header.cc:571
ns3::WifiMacHeader::SetType
void SetType(WifiMacType type, bool resetToDsFromDs=true)
Set Type/Subtype values with the correct values depending on the given type.
Definition: wifi-mac-header.cc:132
ns3::FrameExchangeManager::RxStartIndication
void RxStartIndication(WifiTxVector txVector, Time psduDuration)
Definition: frame-exchange-manager.cc:232
ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts
virtual void RetransmitMpduAfterMissedCts(Ptr< WifiMacQueueItem > mpdu) const
Retransmit an MPDU that was not sent because a CTS was not received.
Definition: frame-exchange-manager.cc:827
ns3::FrameExchangeManager::SendCtsAfterRts
void SendCtsAfterRts(const WifiMacHeader &rtsHdr, WifiMode rtsTxMode, double rtsSnr)
Send CTS after receiving RTS.
Definition: frame-exchange-manager.cc:633
ns3::QosTxop::PeekNextMpdu
Ptr< const WifiMacQueueItem > PeekNextMpdu(uint8_t tid=8, Mac48Address recipient=Mac48Address::GetBroadcast(), Ptr< const WifiMacQueueItem > item=nullptr)
Peek the next frame to transmit to the given receiver and of the given TID from the EDCA queue.
Definition: qos-txop.cc:357
ns3::WifiTxParameters::AddMpdu
void AddMpdu(Ptr< const WifiMacQueueItem > mpdu)
Record that an MPDU is being added to the current frame.
Definition: wifi-tx-parameters.cc:98
ns3::WifiMacHeader::SetDsNotTo
void SetDsNotTo(void)
Un-set the To DS bit in the Frame Control field.
Definition: wifi-mac-header.cc:102
ns3::FrameExchangeManager::~FrameExchangeManager
virtual ~FrameExchangeManager()
Definition: frame-exchange-manager.cc:62
ns3::ObjectBase::TraceConnectWithoutContext
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:293
ns3::WifiProtection::RTS_CTS
@ RTS_CTS
Definition: wifi-protection.h:48
ns3::WifiMacQueueItem::IsFragment
bool IsFragment(void) const
Return true if this item contains an MSDU fragment, false otherwise.
Definition: wifi-mac-queue-item.cc:108
ns3::FrameExchangeManager::GetWifiTxTimer
const WifiTxTimer & GetWifiTxTimer(void) const
Get a const reference to the WifiTxTimer object.
Definition: frame-exchange-manager.cc:217
ns3::WifiPsdu::begin
std::vector< Ptr< WifiMacQueueItem > >::const_iterator begin(void) const
Return a const iterator to the first MPDU.
Definition: wifi-psdu.cc:325
ns3::FrameExchangeManager::EndReceiveAmpdu
virtual void EndReceiveAmpdu(Ptr< const WifiPsdu > psdu, const RxSignalInfo &rxSignalInfo, const WifiTxVector &txVector, const std::vector< bool > &perMpduStatus)
This method is called when the reception of an A-MPDU including multiple MPDUs is completed.
Definition: frame-exchange-manager.cc:1174
ns3::FrameExchangeManager::ReceivedNormalAck
virtual void ReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector, const WifiTxVector &ackTxVector, const RxSignalInfo &rxInfo, double snr)
Perform the actions needed when a Normal Ack is received.
Definition: frame-exchange-manager.cc:1122
ns3::WifiMacQueueItem::GetSize
uint32_t GetSize(void) const
Return the size of the packet stored by this item, including header size and trailer size.
Definition: wifi-mac-queue-item.cc:102
ns3::WifiAcknowledgment::method
const Method method
acknowledgment method
Definition: wifi-acknowledgment.h:103
ns3::FrameExchangeManager::SetBssid
virtual void SetBssid(Mac48Address bssid)
Set the Basic Service Set Identification.
Definition: frame-exchange-manager.cc:184
ns3::WIFI_MAC_CTL_RTS
@ WIFI_MAC_CTL_RTS
Definition: wifi-mac-header.h:40
ns3::WifiMacHeader::GetAddr2
Mac48Address GetAddr2(void) const
Return the address in the Address 2 field.
Definition: wifi-mac-header.cc:430
ns3::GetCtsSize
uint32_t GetCtsSize(void)
Return the total CTS size (including FCS trailer).
Definition: wifi-utils.cc:108
ns3::WifiPhy::GetSifs
Time GetSifs(void) const
Return the Short Interframe Space (SIFS) for this PHY.
Definition: wifi-phy.cc:911
ns3::FrameExchangeManager::PreProcessFrame
virtual void PreProcessFrame(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
Perform actions that are possibly needed when receiving any frame, independently of whether the frame...
Definition: frame-exchange-manager.cc:951
ns3::WifiTxTimer::Set
void Set(Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args)
This method is called when a frame soliciting a response is transmitted.
Definition: wifi-tx-timer.h:246
ns3::FrameExchangeManager::SendMpdu
void SendMpdu(void)
Send the current MPDU, which can be acknowledged by a Normal Ack.
Definition: frame-exchange-manager.cc:384
ns3::FrameExchangeManager::GetTypeId
static TypeId GetTypeId(void)
Get the type ID.
Definition: frame-exchange-manager.cc:44
wifi-mac-trailer.h
ns3::FrameExchangeManager::m_fragmentedPacket
Ptr< Packet > m_fragmentedPacket
the MSDU being fragmented
Definition: frame-exchange-manager.h:548
ns3::Object::DoDispose
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:346
ns3::WifiTxTimer::Cancel
void Cancel(void)
Cancel the timer.
Definition: wifi-tx-timer.cc:127
ns3::WifiTxTimer
This class is used to handle the timer that a station starts when transmitting a frame that solicits ...
Definition: wifi-tx-timer.h:48
ns3::WifiPhy::Send
void Send(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
This function is a wrapper for the Send variant that accepts a WifiConstPsduMap as first argument.
Definition: wifi-phy.cc:1790
ns3::WifiCtsToSelfProtection
WifiCtsToSelfProtection specifies that CTS-to-self protection method is used.
Definition: wifi-protection.h:113
ns3::WifiTxVector::GetMode
WifiMode GetMode(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the selected payload transmission mode.
Definition: wifi-tx-vector.cc:112
ns3::FrameExchangeManager::FrameExchangeManager
FrameExchangeManager()
Definition: frame-exchange-manager.cc:54
third.phy
phy
Definition: third.py:93
ns3::FrameExchangeManager::NormalAckTimeout
void NormalAckTimeout(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector)
Called when the Ack timeout expires.
Definition: frame-exchange-manager.cc:767
ns3::FrameExchangeManager::m_dcf
Ptr< Txop > m_dcf
the DCF/EDCAF that gained channel access
Definition: frame-exchange-manager.h:378
PSDU_DURATION_SAFEGUARD
#define PSDU_DURATION_SAFEGUARD
Definition: frame-exchange-manager.cc:35
NS_ABORT_MSG
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition: abort.h:50