src/devices/wifi/edca-txop-n.cc
changeset 5976 dba5c9b69c3b
parent 5965 4e64e751be07
child 5999 ee04189aec1b
equal deleted inserted replaced
5975:c85cb9b073a0 5976:dba5c9b69c3b
    35 #include "qos-blocked-destinations.h"
    35 #include "qos-blocked-destinations.h"
    36 #include "block-ack-manager.h"
    36 #include "block-ack-manager.h"
    37 
    37 
    38 NS_LOG_COMPONENT_DEFINE ("EdcaTxopN");
    38 NS_LOG_COMPONENT_DEFINE ("EdcaTxopN");
    39 
    39 
    40 #define MY_DEBUG(x) \
    40 #undef NS_LOG_APPEND_CONTEXT
    41   NS_LOG_DEBUG (m_low->GetAddress () << " " << x)
    41 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_low->GetAddress () << "] ";
    42 
    42 
    43 namespace ns3 {
    43 namespace ns3 {
    44 
    44 
    45 class EdcaTxopN::Dcf : public DcfState
    45 class EdcaTxopN::Dcf : public DcfState
    46 {
    46 {
   315   NS_LOG_FUNCTION (this);
   315   NS_LOG_FUNCTION (this);
   316   if (m_currentPacket == 0)
   316   if (m_currentPacket == 0)
   317     {
   317     {
   318       if (m_queue->IsEmpty () && !m_baManager->HasPackets ())
   318       if (m_queue->IsEmpty () && !m_baManager->HasPackets ())
   319         {
   319         {
   320           MY_DEBUG ("queue is empty");
   320           NS_LOG_DEBUG ("queue is empty");
   321           return; 
   321           return; 
   322         }
   322         }
   323       struct Bar bar;
   323       struct Bar bar;
   324       if (m_baManager->HasBar (bar))
   324       if (m_baManager->HasBar (bar))
   325         {
   325         {
   330       m_currentPacket = m_baManager->GetNextPacket (m_currentHdr);
   330       m_currentPacket = m_baManager->GetNextPacket (m_currentHdr);
   331       if (m_currentPacket == 0)
   331       if (m_currentPacket == 0)
   332         {
   332         {
   333           if (m_queue->PeekFirstAvailable (&m_currentHdr, m_currentPacketTimestamp, m_qosBlockedDestinations) == 0)
   333           if (m_queue->PeekFirstAvailable (&m_currentHdr, m_currentPacketTimestamp, m_qosBlockedDestinations) == 0)
   334             {
   334             {
   335               MY_DEBUG ("no available packets in the queue");
   335               NS_LOG_DEBUG ("no available packets in the queue");
   336               return;
   336               return;
   337             }
   337             }
   338           if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast () &&
   338           if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast () &&
   339               m_blockAckThreshold > 0 &&
   339               m_blockAckThreshold > 0 &&
   340               !m_baManager->ExistsAgreement (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ()) &&
   340               !m_baManager->ExistsAgreement (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ()) &&
   349           m_currentHdr.SetSequenceNumber (sequence);
   349           m_currentHdr.SetSequenceNumber (sequence);
   350           m_currentHdr.SetFragmentNumber (0);
   350           m_currentHdr.SetFragmentNumber (0);
   351           m_currentHdr.SetNoMoreFragments ();
   351           m_currentHdr.SetNoMoreFragments ();
   352           m_currentHdr.SetNoRetry ();
   352           m_currentHdr.SetNoRetry ();
   353           m_fragmentNumber = 0;
   353           m_fragmentNumber = 0;
   354           MY_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<<
   354           NS_LOG_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<<
   355                     ", to="<<m_currentHdr.GetAddr1 ()<<
   355                     ", to="<<m_currentHdr.GetAddr1 ()<<
   356                     ", seq="<<m_currentHdr.GetSequenceControl ());
   356                     ", seq="<<m_currentHdr.GetSequenceControl ());
   357           if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast ())
   357           if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast ())
   358             {
   358             {
   359               VerifyBlockAck ();
   359               VerifyBlockAck ();
   374       
   374       
   375       m_currentPacket = 0;
   375       m_currentPacket = 0;
   376       m_dcf->ResetCw ();
   376       m_dcf->ResetCw ();
   377       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   377       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   378       StartAccessIfNeeded ();
   378       StartAccessIfNeeded ();
   379       MY_DEBUG ("tx broadcast");
   379       NS_LOG_DEBUG ("tx broadcast");
   380     }
   380     }
   381   else
   381   else
   382     {
   382     {
   383       if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
   383       if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
   384         {
   384         {
   398           params.DisableRts ();
   398           params.DisableRts ();
   399           WifiMacHeader hdr;
   399           WifiMacHeader hdr;
   400           Ptr<Packet> fragment = GetFragmentPacket (&hdr);
   400           Ptr<Packet> fragment = GetFragmentPacket (&hdr);
   401           if (IsLastFragment ()) 
   401           if (IsLastFragment ()) 
   402             {
   402             {
   403               MY_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ());
   403               NS_LOG_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ());
   404               params.DisableNextData ();
   404               params.DisableNextData ();
   405             } 
   405             } 
   406           else 
   406           else 
   407             {
   407             {
   408               MY_DEBUG ("fragmenting size=" << fragment->GetSize ());
   408               NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ());
   409               params.EnableNextData (GetNextFragmentSize ());
   409               params.EnableNextData (GetNextFragmentSize ());
   410             }
   410             }
   411           m_low->StartTransmission (fragment, &hdr, params, 
   411           m_low->StartTransmission (fragment, &hdr, params, 
   412                                     m_transmissionListener);
   412                                     m_transmissionListener);
   413         }
   413         }
   451                 {
   451                 {
   452                   m_currentHdr.SetQosAmsdu ();
   452                   m_currentHdr.SetQosAmsdu ();
   453                   m_currentHdr.SetAddr3 (m_low->GetBssid ());
   453                   m_currentHdr.SetAddr3 (m_low->GetBssid ());
   454                   m_currentPacket = currentAggregatedPacket;
   454                   m_currentPacket = currentAggregatedPacket;
   455                   currentAggregatedPacket = 0;
   455                   currentAggregatedPacket = 0;
   456                   MY_DEBUG ("tx unicast A-MSDU");
   456                   NS_LOG_DEBUG ("tx unicast A-MSDU");
   457                 }
   457                 }
   458             }
   458             }
   459           if (NeedRts ())
   459           if (NeedRts ())
   460             {
   460             {
   461               params.EnableRts ();
   461               params.EnableRts ();
   462               MY_DEBUG ("tx unicast rts");
   462               NS_LOG_DEBUG ("tx unicast rts");
   463             } 
   463             } 
   464           else 
   464           else 
   465             {
   465             {
   466               params.DisableRts ();
   466               params.DisableRts ();
   467               MY_DEBUG ("tx unicast");
   467               NS_LOG_DEBUG ("tx unicast");
   468             }
   468             }
   469           params.DisableNextData ();
   469           params.DisableNextData ();
   470           m_low->StartTransmission (m_currentPacket, &m_currentHdr,
   470           m_low->StartTransmission (m_currentPacket, &m_currentHdr,
   471                                     params, m_transmissionListener);
   471                                     params, m_transmissionListener);
   472           CompleteTx ();
   472           CompleteTx ();
   490 
   490 
   491 void 
   491 void 
   492 EdcaTxopN::GotCts (double snr, WifiMode txMode)
   492 EdcaTxopN::GotCts (double snr, WifiMode txMode)
   493 {
   493 {
   494   NS_LOG_FUNCTION (this << snr << txMode);
   494   NS_LOG_FUNCTION (this << snr << txMode);
   495   MY_DEBUG ("got cts");
   495   NS_LOG_DEBUG ("got cts");
   496 }
   496 }
   497 
   497 
   498 void 
   498 void 
   499 EdcaTxopN::MissedCts (void)
   499 EdcaTxopN::MissedCts (void)
   500 {
   500 {
   501   NS_LOG_FUNCTION (this);
   501   NS_LOG_FUNCTION (this);
   502   MY_DEBUG ("missed cts");
   502   NS_LOG_DEBUG ("missed cts");
   503   if (!NeedRtsRetransmission ())
   503   if (!NeedRtsRetransmission ())
   504     {
   504     {
   505       MY_DEBUG ("Cts Fail");
   505       NS_LOG_DEBUG ("Cts Fail");
   506       WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
   506       WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
   507       station->ReportFinalRtsFailed ();
   507       station->ReportFinalRtsFailed ();
   508       if (!m_txFailedCallback.IsNull ()) 
   508       if (!m_txFailedCallback.IsNull ()) 
   509         {
   509         {
   510           m_txFailedCallback (m_currentHdr);
   510           m_txFailedCallback (m_currentHdr);
   546   NS_LOG_FUNCTION (this << snr << txMode);
   546   NS_LOG_FUNCTION (this << snr << txMode);
   547   if (!NeedFragmentation () ||
   547   if (!NeedFragmentation () ||
   548       IsLastFragment () ||
   548       IsLastFragment () ||
   549       m_currentHdr.IsQosAmsdu ()) 
   549       m_currentHdr.IsQosAmsdu ()) 
   550     {
   550     {
   551       MY_DEBUG ("got ack. tx done.");
   551       NS_LOG_DEBUG ("got ack. tx done.");
   552       if (!m_txOkCallback.IsNull ())
   552       if (!m_txOkCallback.IsNull ())
   553         {
   553         {
   554            m_txOkCallback (m_currentHdr);
   554            m_txOkCallback (m_currentHdr);
   555         }
   555         }
   556       
   556       
   580       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   580       m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   581       RestartAccessIfNeeded ();
   581       RestartAccessIfNeeded ();
   582     } 
   582     } 
   583   else 
   583   else 
   584     {
   584     {
   585       MY_DEBUG ("got ack. tx not done, size="<<m_currentPacket->GetSize ());
   585       NS_LOG_DEBUG ("got ack. tx not done, size="<<m_currentPacket->GetSize ());
   586     }
   586     }
   587 }
   587 }
   588 
   588 
   589 void
   589 void
   590 EdcaTxopN::MissedAck (void)
   590 EdcaTxopN::MissedAck (void)
   591 {
   591 {
   592   NS_LOG_FUNCTION (this);
   592   NS_LOG_FUNCTION (this);
   593   MY_DEBUG ("missed ack");
   593   NS_LOG_DEBUG ("missed ack");
   594   if (!NeedDataRetransmission ()) 
   594   if (!NeedDataRetransmission ()) 
   595     {
   595     {
   596       MY_DEBUG ("Ack Fail");
   596       NS_LOG_DEBUG ("Ack Fail");
   597       WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
   597       WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
   598       station->ReportFinalDataFailed ();
   598       station->ReportFinalDataFailed ();
   599       if (!m_txFailedCallback.IsNull ()) 
   599       if (!m_txFailedCallback.IsNull ()) 
   600         {
   600         {
   601           m_txFailedCallback (m_currentHdr);
   601           m_txFailedCallback (m_currentHdr);
   604       m_currentPacket = 0;
   604       m_currentPacket = 0;
   605       m_dcf->ResetCw ();
   605       m_dcf->ResetCw ();
   606     } 
   606     } 
   607   else 
   607   else 
   608     {
   608     {
   609       MY_DEBUG ("Retransmit");
   609       NS_LOG_DEBUG ("Retransmit");
   610       m_currentHdr.SetRetry ();
   610       m_currentHdr.SetRetry ();
   611       m_dcf->UpdateFailedCw ();
   611       m_dcf->UpdateFailedCw ();
   612     }
   612     }
   613   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   613   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   614   RestartAccessIfNeeded ();
   614   RestartAccessIfNeeded ();
   616 
   616 
   617 void
   617 void
   618 EdcaTxopN::MissedBlockAck (void)
   618 EdcaTxopN::MissedBlockAck (void)
   619 {
   619 {
   620   NS_LOG_FUNCTION (this);
   620   NS_LOG_FUNCTION (this);
   621   MY_DEBUG ("missed block ack");
   621   NS_LOG_DEBUG ("missed block ack");
   622   //should i report this to station addressed by ADDR1?
   622   //should i report this to station addressed by ADDR1?
   623   MY_DEBUG ("Retransmit block ack request");
   623   NS_LOG_DEBUG ("Retransmit block ack request");
   624   m_currentHdr.SetRetry ();
   624   m_currentHdr.SetRetry ();
   625   m_dcf->UpdateFailedCw ();
   625   m_dcf->UpdateFailedCw ();
   626   
   626   
   627   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   627   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   628   RestartAccessIfNeeded ();
   628   RestartAccessIfNeeded ();
   687 
   687 
   688 void 
   688 void 
   689 EdcaTxopN::StartNext (void)
   689 EdcaTxopN::StartNext (void)
   690 {
   690 {
   691   NS_LOG_FUNCTION (this);
   691   NS_LOG_FUNCTION (this);
   692   MY_DEBUG ("start next packet fragment");
   692   NS_LOG_DEBUG ("start next packet fragment");
   693   /* this callback is used only for fragments. */
   693   /* this callback is used only for fragments. */
   694   NextFragment ();
   694   NextFragment ();
   695   WifiMacHeader hdr;
   695   WifiMacHeader hdr;
   696   Ptr<Packet> fragment = GetFragmentPacket (&hdr);
   696   Ptr<Packet> fragment = GetFragmentPacket (&hdr);
   697   MacLowTransmissionParameters params;
   697   MacLowTransmissionParameters params;
   711 
   711 
   712 void
   712 void
   713 EdcaTxopN::Cancel (void)
   713 EdcaTxopN::Cancel (void)
   714 {
   714 {
   715   NS_LOG_FUNCTION (this);
   715   NS_LOG_FUNCTION (this);
   716   MY_DEBUG ("transmission cancelled");
   716   NS_LOG_DEBUG ("transmission cancelled");
   717 }
   717 }
   718 
   718 
   719 bool
   719 bool
   720 EdcaTxopN::NeedFragmentation (void) const
   720 EdcaTxopN::NeedFragmentation (void) const
   721 {
   721 {
   833 
   833 
   834 void
   834 void
   835 EdcaTxopN::GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
   835 EdcaTxopN::GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
   836 {
   836 {
   837   NS_LOG_FUNCTION (this);
   837   NS_LOG_FUNCTION (this);
   838   MY_DEBUG ("received ADDBA response from "<<recipient);
   838   NS_LOG_DEBUG ("received ADDBA response from "<<recipient);
   839   uint8_t tid = respHdr->GetTid ();
   839   uint8_t tid = respHdr->GetTid ();
   840   if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::PENDING))
   840   if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::PENDING))
   841    {
   841    {
   842      if (respHdr->GetStatusCode ().IsSuccess ())
   842      if (respHdr->GetStatusCode ().IsSuccess ())
   843        {
   843        {
   844          MY_DEBUG ("block ack agreement established with "<<recipient);
   844          NS_LOG_DEBUG ("block ack agreement established with "<<recipient);
   845          m_baManager->UpdateAgreement (respHdr, recipient);
   845          m_baManager->UpdateAgreement (respHdr, recipient);
   846        }
   846        }
   847      else
   847      else
   848        {
   848        {
   849          MY_DEBUG ("discard ADDBA response"<<recipient);
   849          NS_LOG_DEBUG ("discard ADDBA response"<<recipient);
   850          m_baManager->NotifyAgreementUnsuccessful (recipient, tid);
   850          m_baManager->NotifyAgreementUnsuccessful (recipient, tid);
   851        }
   851        }
   852     }
   852     }
   853   RestartAccessIfNeeded ();
   853   RestartAccessIfNeeded ();
   854 }
   854 }
   855 
   855 
   856 void
   856 void
   857 EdcaTxopN::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
   857 EdcaTxopN::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
   858 {
   858 {
   859   NS_LOG_FUNCTION (this);
   859   NS_LOG_FUNCTION (this);
   860   MY_DEBUG ("received DELBA frame from="<<recipient);
   860   NS_LOG_DEBUG ("received DELBA frame from="<<recipient);
   861   m_baManager->TearDownBlockAck (recipient, delBaHdr->GetTid ());
   861   m_baManager->TearDownBlockAck (recipient, delBaHdr->GetTid ());
   862 }
   862 }
   863 
   863 
   864 void
   864 void
   865 EdcaTxopN::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient)
   865 EdcaTxopN::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient)
   866 {
   866 {
   867   MY_DEBUG ("got block ack from="<<recipient);
   867   NS_LOG_DEBUG ("got block ack from="<<recipient);
   868   m_baManager->NotifyGotBlockAck (blockAck, recipient);
   868   m_baManager->NotifyGotBlockAck (blockAck, recipient);
   869   m_currentPacket = 0;
   869   m_currentPacket = 0;
   870   m_dcf->ResetCw ();
   870   m_dcf->ResetCw ();
   871   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   871   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   872   RestartAccessIfNeeded ();
   872   RestartAccessIfNeeded ();
   994 void
   994 void
   995 EdcaTxopN::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startSeq, 
   995 EdcaTxopN::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startSeq, 
   996                              uint16_t timeout, bool immediateBAck)
   996                              uint16_t timeout, bool immediateBAck)
   997 {
   997 {
   998   NS_LOG_FUNCTION (this);
   998   NS_LOG_FUNCTION (this);
   999   MY_DEBUG ("sent ADDBA request to "<<dest);
   999   NS_LOG_DEBUG ("sent ADDBA request to "<<dest);
  1000   WifiMacHeader hdr;
  1000   WifiMacHeader hdr;
  1001   hdr.SetAction ();
  1001   hdr.SetAction ();
  1002   hdr.SetAddr1 (dest);
  1002   hdr.SetAddr1 (dest);
  1003   hdr.SetAddr2 (m_low->GetAddress ());
  1003   hdr.SetAddr2 (m_low->GetAddress ());
  1004   hdr.SetAddr3 (m_low->GetAddress ());
  1004   hdr.SetAddr3 (m_low->GetAddress ());