src/devices/wifi/edca-txop-n.cc
changeset 5964 8a59a619c30e
parent 5963 5f82c5a7068e
child 5965 4e64e751be07
equal deleted inserted replaced
5963:5f82c5a7068e 5964:8a59a619c30e
   100 
   100 
   101 private:
   101 private:
   102   EdcaTxopN *m_txop;
   102   EdcaTxopN *m_txop;
   103 };
   103 };
   104 
   104 
       
   105 class EdcaTxopN::BlockAckEventListener : public MacLowBlockAckEventListener
       
   106 {
       
   107 public:
       
   108   BlockAckEventListener (EdcaTxopN *txop)
       
   109     : MacLowBlockAckEventListener (),
       
   110       m_txop (txop) {}
       
   111   virtual ~BlockAckEventListener () {}
       
   112 
       
   113   virtual void BlockAckInactivityTimeout (Mac48Address address, uint8_t tid) {
       
   114     m_txop->SendDelbaFrame (address, tid, false);
       
   115   }
       
   116 
       
   117 private:
       
   118   EdcaTxopN *m_txop;
       
   119 };
       
   120 
   105 NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN);
   121 NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN);
   106 
   122 
   107 TypeId
   123 TypeId
   108 EdcaTxopN::GetTypeId (void)
   124 EdcaTxopN::GetTypeId (void)
   109 {
   125 {
   126     m_aggregator (0),
   142     m_aggregator (0),
   127     m_blockAckType (COMPRESSED_BLOCK_ACK)
   143     m_blockAckType (COMPRESSED_BLOCK_ACK)
   128 {
   144 {
   129   NS_LOG_FUNCTION (this);
   145   NS_LOG_FUNCTION (this);
   130   m_transmissionListener = new EdcaTxopN::TransmissionListener (this);
   146   m_transmissionListener = new EdcaTxopN::TransmissionListener (this);
       
   147   m_blockAckListener = new EdcaTxopN::BlockAckEventListener (this);
   131   m_dcf = new EdcaTxopN::Dcf (this);
   148   m_dcf = new EdcaTxopN::Dcf (this);
   132   m_queue = CreateObject<WifiMacQueue> ();
   149   m_queue = CreateObject<WifiMacQueue> ();
   133   m_rng = new RealRandomStream ();
   150   m_rng = new RealRandomStream ();
   134   m_qosBlockedDestinations = new QosBlockedDestinations ();
   151   m_qosBlockedDestinations = new QosBlockedDestinations ();
   135   m_baManager = new BlockAckManager ();
   152   m_baManager = new BlockAckManager ();
   155   delete m_transmissionListener;
   172   delete m_transmissionListener;
   156   delete m_dcf;
   173   delete m_dcf;
   157   delete m_rng;
   174   delete m_rng;
   158   delete m_qosBlockedDestinations;
   175   delete m_qosBlockedDestinations;
   159   delete m_baManager;
   176   delete m_baManager;
       
   177   delete m_blockAckListener;
   160   m_transmissionListener = 0;
   178   m_transmissionListener = 0;
   161   m_dcf = 0;
   179   m_dcf = 0;
   162   m_rng = 0;
   180   m_rng = 0;
   163   m_qosBlockedDestinations = 0;
   181   m_qosBlockedDestinations = 0;
   164   m_baManager = 0;
   182   m_baManager = 0;
       
   183   m_blockAckListener = 0;
   165   m_txMiddle = 0;
   184   m_txMiddle = 0;
   166   m_aggregator = 0;
   185   m_aggregator = 0;
   167 }
   186 }
   168 
   187 
   169 void
   188 void
   525       MY_DEBUG ("got ack. tx done.");
   544       MY_DEBUG ("got ack. tx done.");
   526       if (!m_txOkCallback.IsNull ())
   545       if (!m_txOkCallback.IsNull ())
   527         {
   546         {
   528            m_txOkCallback (m_currentHdr);
   547            m_txOkCallback (m_currentHdr);
   529         }
   548         }
       
   549       
       
   550       if (m_currentHdr.IsAction ())
       
   551         {
       
   552           WifiActionHeader actionHdr;
       
   553           Ptr<Packet> p = m_currentPacket->Copy ();
       
   554           p->RemoveHeader (actionHdr);
       
   555           if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
       
   556               actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
       
   557             {
       
   558               MgtDelBaHeader delBa;
       
   559               p->PeekHeader (delBa);
       
   560               if (delBa.IsByOriginator ())
       
   561                 {
       
   562                   m_baManager->TearDownBlockAck (m_currentHdr.GetAddr1 (), delBa.GetTid ());
       
   563                 }
       
   564               else
       
   565                 {
       
   566                   m_low->DestroyBlockAckAgreement (m_currentHdr.GetAddr1 (), delBa.GetTid ());
       
   567                 }
       
   568             }
       
   569         }
   530       m_currentPacket = 0;
   570       m_currentPacket = 0;
   531          
   571          
   532       m_dcf->ResetCw ();
   572       m_dcf->ResetCw ();
   533       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   573       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   534       RestartAccessIfNeeded ();
   574       RestartAccessIfNeeded ();
   726       hdr->SetMoreFragments ();
   766       hdr->SetMoreFragments ();
   727     }
   767     }
   728   fragment = m_currentPacket->CreateFragment (startOffset, 
   768   fragment = m_currentPacket->CreateFragment (startOffset, 
   729                                               GetFragmentSize ());
   769                                               GetFragmentSize ());
   730   return fragment;
   770   return fragment;
       
   771 }
       
   772 
       
   773 void
       
   774 EdcaTxopN::SetAccessClass (enum AccessClass ac)
       
   775 {
       
   776   m_ac = ac;
   731 }
   777 }
   732 
   778 
   733 Mac48Address
   779 Mac48Address
   734 EdcaTxopN::MapSrcAddressForAggregation (const WifiMacHeader &hdr)
   780 EdcaTxopN::MapSrcAddressForAggregation (const WifiMacHeader &hdr)
   735 {
   781 {
   911 void
   957 void
   912 EdcaTxopN::CompleteConfig (void)
   958 EdcaTxopN::CompleteConfig (void)
   913 {
   959 {
   914   NS_LOG_FUNCTION (this);
   960   NS_LOG_FUNCTION (this);
   915   m_baManager->SetTxMiddle (m_txMiddle);
   961   m_baManager->SetTxMiddle (m_txMiddle);
       
   962   m_low->RegisterBlockAckListenerForAc (m_ac, m_blockAckListener);
   916 }
   963 }
   917 
   964 
   918 void
   965 void
   919 EdcaTxopN::SetBlockAckThreshold (uint8_t threshold)
   966 EdcaTxopN::SetBlockAckThreshold (uint8_t threshold)
   920 {
   967 {
   990   
  1037   
   991   m_low->StartTransmission (m_currentPacket, &m_currentHdr, params, 
  1038   m_low->StartTransmission (m_currentPacket, &m_currentHdr, params, 
   992                             m_transmissionListener);
  1039                             m_transmissionListener);
   993 }
  1040 }
   994 
  1041 
       
  1042 void
       
  1043 EdcaTxopN::SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator)
       
  1044 {
       
  1045   WifiMacHeader hdr;
       
  1046   hdr.SetAction ();
       
  1047   hdr.SetAddr1 (addr);
       
  1048   hdr.SetAddr2 (m_low->GetAddress ());
       
  1049   hdr.SetAddr3 (m_low->GetAddress ());
       
  1050   hdr.SetDsNotTo ();
       
  1051   hdr.SetDsNotFrom ();
       
  1052 
       
  1053   MgtDelBaHeader delbaHdr;
       
  1054   delbaHdr.SetTid (tid);
       
  1055   if (byOriginator)
       
  1056     {
       
  1057       delbaHdr.SetByOriginator ();
       
  1058     }
       
  1059   else
       
  1060     {
       
  1061       delbaHdr.SetByRecipient ();
       
  1062     }
       
  1063 
       
  1064   WifiActionHeader actionHdr;
       
  1065   WifiActionHeader::ActionValue action;
       
  1066   action.blockAck = WifiActionHeader::BLOCK_ACK_DELBA;
       
  1067   actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
       
  1068   
       
  1069   Ptr<Packet> packet = Create<Packet> ();
       
  1070   packet->AddHeader (delbaHdr);
       
  1071   packet->AddHeader (actionHdr);
       
  1072 
       
  1073   PushFront (packet, hdr);
       
  1074 }
       
  1075 
   995 } //namespace ns3
  1076 } //namespace ns3