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 { |
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 (); |
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); |
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; |
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 ()); |