LEFT | RIGHT |
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2006, 2009 INRIA | 3 * Copyright (c) 2006, 2009 INRIA |
4 * Copyright (c) 2009 MIRKO BANCHI | 4 * Copyright (c) 2009 MIRKO BANCHI |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License version 2 as· | 7 * it under the terms of the GNU General Public License version 2 as· |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } | 78 } |
79 virtual void MissedCts (void) { | 79 virtual void MissedCts (void) { |
80 m_txop->MissedCts (); | 80 m_txop->MissedCts (); |
81 } | 81 } |
82 virtual void GotAck (double snr, WifiMode txMode) { | 82 virtual void GotAck (double snr, WifiMode txMode) { |
83 m_txop->GotAck (snr, txMode); | 83 m_txop->GotAck (snr, txMode); |
84 } | 84 } |
85 virtual void MissedAck (void) { | 85 virtual void MissedAck (void) { |
86 m_txop->MissedAck (); | 86 m_txop->MissedAck (); |
87 } | 87 } |
88 virtual void GotBlockAck (CtrlBAckResponseHeader const *blockAck, Mac48Address
source) { | 88 virtual void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address
source) { |
89 m_txop->GotBlockAck (blockAck, source); | 89 m_txop->GotBlockAck (blockAck, source); |
90 } | 90 } |
91 virtual void MissedBlockAck (void) { | 91 virtual void MissedBlockAck (void) { |
92 m_txop->MissedBlockAck (); | 92 m_txop->MissedBlockAck (); |
93 } | 93 } |
94 virtual void StartNext (void) { | 94 virtual void StartNext (void) { |
95 m_txop->StartNext (); | 95 m_txop->StartNext (); |
96 } | 96 } |
97 virtual void Cancel (void) { | 97 virtual void Cancel (void) { |
98 m_txop->Cancel (); | 98 m_txop->Cancel (); |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 EdcaTxopN::NotifyAccessGranted (void) | 313 EdcaTxopN::NotifyAccessGranted (void) |
314 { | 314 { |
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 MY_DEBUG ("queue is empty"); |
321 return;· | 321 return;· |
322 } | 322 } |
| 323 struct Bar bar; |
| 324 if (m_baManager->HasBar (bar)) |
| 325 { |
| 326 SendBlockAckRequest (bar); |
| 327 return; |
| 328 } |
323 /* check if packets need retransmission are stored in BlockAckManager */ | 329 /* check if packets need retransmission are stored in BlockAckManager */ |
324 m_currentPacket = m_baManager->GetNextPacket (m_currentHdr); | 330 m_currentPacket = m_baManager->GetNextPacket (m_currentHdr); |
325 if (m_currentPacket == 0) | 331 if (m_currentPacket == 0) |
326 { | 332 { |
327 if (m_queue->PeekFirstAvailable (&m_currentHdr, m_currentPacketTimesta
mp, m_qosBlockedDestinations) == 0) | 333 if (m_queue->PeekFirstAvailable (&m_currentHdr, m_currentPacketTimesta
mp, m_qosBlockedDestinations) == 0) |
328 { | 334 { |
329 MY_DEBUG ("no available packets in the queue"); | 335 MY_DEBUG ("no available packets in the queue"); |
330 return; | 336 return; |
331 } | 337 } |
332 if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast
() && | 338 if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast
() && |
333 m_blockAckThreshold > 0 && | 339 m_blockAckThreshold > 0 && |
334 !m_baManager->ExistsAgreement (m_currentHdr.GetAddr1 (), m_current
Hdr.GetQosTid ()) && | 340 !m_baManager->ExistsAgreement (m_currentHdr.GetAddr1 (), m_current
Hdr.GetQosTid ()) && |
335 SetupBlockAckIfNeeded ()) | 341 SetupBlockAckIfNeeded ()) |
336 { | 342 { |
337 return; | 343 return; |
338 } | 344 } |
339 m_currentPacket = m_queue->DequeueFirstAvailable (&m_currentHdr, m_cur
rentPacketTimestamp, m_qosBlockedDestinations); | 345 m_currentPacket = m_queue->DequeueFirstAvailable (&m_currentHdr, m_cur
rentPacketTimestamp, m_qosBlockedDestinations); |
340 NS_ASSERT (m_currentPacket != 0); | 346 NS_ASSERT (m_currentPacket != 0); |
341 if (!m_currentHdr.IsBlockAckReq ()) | 347 |
342 { | 348 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHd
r); |
343 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_curre
ntHdr); | 349 m_currentHdr.SetSequenceNumber (sequence); |
344 m_currentHdr.SetSequenceNumber (sequence); | 350 m_currentHdr.SetFragmentNumber (0); |
345 m_currentHdr.SetFragmentNumber (0); | 351 m_currentHdr.SetNoMoreFragments (); |
346 m_currentHdr.SetNoMoreFragments (); | 352 m_currentHdr.SetNoRetry (); |
347 m_currentHdr.SetNoRetry (); | 353 m_fragmentNumber = 0; |
348 } | 354 MY_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<< |
| 355 ", to="<<m_currentHdr.GetAddr1 ()<< |
| 356 ", seq="<<m_currentHdr.GetSequenceControl ()); |
349 if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast
()) | 357 if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast
()) |
350 { | 358 { |
351 VerifyBlockAck (); | 359 VerifyBlockAck (); |
352 } | 360 } |
353 m_fragmentNumber = 0; | |
354 MY_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<< | |
355 ", to="<<m_currentHdr.GetAddr1 ()<< | |
356 ", seq="<<m_currentHdr.GetSequenceControl ()); | |
357 } | 361 } |
358 } | 362 } |
359 MacLowTransmissionParameters params; | 363 MacLowTransmissionParameters params; |
360 params.DisableOverrideDurationId (); | 364 params.DisableOverrideDurationId (); |
361 if (m_currentHdr.IsBlockAckReq ()) | 365 if (m_currentHdr.GetAddr1 ().IsBroadcast ())· |
362 { | |
363 SendBlockAckRequest (); | |
364 } | |
365 else if (m_currentHdr.GetAddr1 ().IsBroadcast ())· | |
366 { | 366 { |
367 params.DisableRts (); | 367 params.DisableRts (); |
368 params.DisableAck (); | 368 params.DisableAck (); |
369 params.DisableNextData (); | 369 params.DisableNextData (); |
370 m_low->StartTransmission (m_currentPacket, | 370 m_low->StartTransmission (m_currentPacket, |
371 &m_currentHdr, | 371 &m_currentHdr, |
372 params, | 372 params, |
373 m_transmissionListener); | 373 m_transmissionListener); |
374 ······ | 374 ······ |
375 m_currentPacket = 0; | 375 m_currentPacket = 0; |
(...skipping 27 matching lines...) Expand all Loading... |
403 MY_DEBUG ("fragmenting last fragment size=" << fragment->GetSize (
)); | 403 MY_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 MY_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 if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) | |
414 { | |
415 m_baManager->StorePacket (fragment, hdr, m_currentPacketTimestamp)
; | |
416 } | |
417 } | 413 } |
418 else | 414 else |
419 { | 415 { |
420 WifiMacHeader peekedHdr; | 416 WifiMacHeader peekedHdr; |
421 if (m_currentHdr.IsQosData () && | 417 if (m_currentHdr.IsQosData () && |
422 m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (
),· | 418 m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (
),· |
423 WifiMacHeader::ADDR1, m_currentHdr.G
etAddr1 ()) && | 419 WifiMacHeader::ADDR1, m_currentHdr.G
etAddr1 ()) && |
424 !m_currentHdr.GetAddr1 ().IsBroadcast () && | 420 !m_currentHdr.GetAddr1 ().IsBroadcast () && |
425 m_aggregator != 0 && !m_currentHdr.IsRetry ()) | 421 m_aggregator != 0 && !m_currentHdr.IsRetry ()) |
426 { | 422 { |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 } | 522 } |
527 | 523 |
528 void· | 524 void· |
529 EdcaTxopN::NotifyChannelSwitching (void) | 525 EdcaTxopN::NotifyChannelSwitching (void) |
530 { | 526 { |
531 m_queue->Flush(); | 527 m_queue->Flush(); |
532 m_currentPacket = 0; | 528 m_currentPacket = 0; |
533 } | 529 } |
534 | 530 |
535 void | 531 void |
536 EdcaTxopN::Queue (Ptr<const Packet> packet, WifiMacHeader const &hdr) | 532 EdcaTxopN::Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr) |
537 { | 533 { |
538 NS_LOG_FUNCTION (this << packet << &hdr); | 534 NS_LOG_FUNCTION (this << packet << &hdr); |
539 WifiMacTrailer fcs; | 535 WifiMacTrailer fcs; |
540 uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.
GetSerializedSize (); | 536 uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.
GetSerializedSize (); |
541 WifiRemoteStation *station = GetStation (hdr.GetAddr1 ()); | 537 WifiRemoteStation *station = GetStation (hdr.GetAddr1 ()); |
542 station->PrepareForQueue (packet, fullPacketSize); | 538 station->PrepareForQueue (packet, fullPacketSize); |
543 m_queue->Enqueue (packet, hdr); | 539 m_queue->Enqueue (packet, hdr); |
544 StartAccessIfNeeded (); | 540 StartAccessIfNeeded (); |
545 } | 541 } |
546 | 542 |
547 void | 543 void |
548 EdcaTxopN::GotAck (double snr, WifiMode txMode) | 544 EdcaTxopN::GotAck (double snr, WifiMode txMode) |
549 { | 545 { |
550 NS_LOG_FUNCTION (this << snr << txMode); | 546 NS_LOG_FUNCTION (this << snr << txMode); |
551 if (!NeedFragmentation () || | 547 if (!NeedFragmentation () || |
552 IsLastFragment () || | 548 IsLastFragment () || |
553 m_currentHdr.IsQosAmsdu ())· | 549 m_currentHdr.IsQosAmsdu ())· |
554 { | 550 { |
555 MY_DEBUG ("got ack. tx done."); | 551 MY_DEBUG ("got ack. tx done."); |
556 if (!m_txOkCallback.IsNull ()) | 552 if (!m_txOkCallback.IsNull ()) |
557 { | 553 { |
558 m_txOkCallback (m_currentHdr); | 554 m_txOkCallback (m_currentHdr); |
559 } | 555 } |
560 ······ | 556 ······ |
561 if (m_currentHdr.IsAction ()) | 557 if (m_currentHdr.IsAction ()) |
562 { | 558 { |
563 MgtActionFrameHeader actHdr; | 559 WifiActionHeader actionHdr; |
564 m_currentPacket->PeekHeader (actHdr); | 560 Ptr<Packet> p = m_currentPacket->Copy (); |
565 if (actHdr.IsDelBa ()) | 561 p->RemoveHeader (actionHdr); |
| 562 if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK && |
| 563 actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_DEL
BA) |
566 { | 564 { |
567 MgtDelBaHeader delBa; | 565 MgtDelBaHeader delBa; |
568 m_currentPacket->PeekHeader (delBa); | 566 p->PeekHeader (delBa); |
569 if (delBa.IsByOriginator ()) | 567 if (delBa.IsByOriginator ()) |
570 { | 568 { |
571 m_baManager->TearDownBlockAck (m_currentHdr.GetAddr1 (), delBa
.GetTid ()); | 569 m_baManager->TearDownBlockAck (m_currentHdr.GetAddr1 (), delBa
.GetTid ()); |
572 } | 570 } |
573 else | 571 else |
574 { | 572 { |
575 m_low->DestroyBlockAckAgreement (m_currentHdr.GetAddr1 (), del
Ba.GetTid ()); | 573 m_low->DestroyBlockAckAgreement (m_currentHdr.GetAddr1 (), del
Ba.GetTid ()); |
576 } | 574 } |
577 } | 575 } |
578 } | 576 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 m_dcf->UpdateFailedCw (); | 611 m_dcf->UpdateFailedCw (); |
614 } | 612 } |
615 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 613 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
616 RestartAccessIfNeeded (); | 614 RestartAccessIfNeeded (); |
617 } | 615 } |
618 | 616 |
619 void | 617 void |
620 EdcaTxopN::MissedBlockAck (void) | 618 EdcaTxopN::MissedBlockAck (void) |
621 { | 619 { |
622 NS_LOG_FUNCTION (this); | 620 NS_LOG_FUNCTION (this); |
623 MY_DEBUG ("missed block ack"); | 621 MY_DEBUG ("missed block ack"); |
624 //should i report this to station addressed by ADDR1? | 622 //should i report this to station addressed by ADDR1? |
625 MY_DEBUG ("Retransmit block ack request"); | 623 MY_DEBUG ("Retransmit block ack request"); |
626 m_currentHdr.SetRetry (); | 624 m_currentHdr.SetRetry (); |
627 m_dcf->UpdateFailedCw (); | 625 m_dcf->UpdateFailedCw (); |
628 ·· | 626 ·· |
629 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 627 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
630 RestartAccessIfNeeded (); | 628 RestartAccessIfNeeded (); |
631 } | 629 } |
632 | 630 |
633 Ptr<MsduAggregator> | 631 Ptr<MsduAggregator> |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 return fragment; | 777 return fragment; |
780 } | 778 } |
781 | 779 |
782 void | 780 void |
783 EdcaTxopN::SetAccessClass (enum AccessClass ac) | 781 EdcaTxopN::SetAccessClass (enum AccessClass ac) |
784 { | 782 { |
785 m_ac = ac; | 783 m_ac = ac; |
786 } | 784 } |
787 | 785 |
788 Mac48Address | 786 Mac48Address |
789 EdcaTxopN::MapSrcAddressForAggregation (WifiMacHeader const &hdr) | 787 EdcaTxopN::MapSrcAddressForAggregation (const WifiMacHeader &hdr) |
790 { | 788 { |
791 Mac48Address retval; | 789 Mac48Address retval; |
792 if (m_typeOfStation == STA || m_typeOfStation == ADHOC_STA) | 790 if (m_typeOfStation == STA || m_typeOfStation == ADHOC_STA) |
793 { | 791 { |
794 retval = hdr.GetAddr2 (); | 792 retval = hdr.GetAddr2 (); |
795 } | 793 } |
796 else | 794 else |
797 { | 795 { |
798 retval = hdr.GetAddr3 (); | 796 retval = hdr.GetAddr3 (); |
799 } | 797 } |
800 return retval; | 798 return retval; |
801 } | 799 } |
802 | 800 |
803 Mac48Address | 801 Mac48Address |
804 EdcaTxopN::MapDestAddressForAggregation (WifiMacHeader const &hdr) | 802 EdcaTxopN::MapDestAddressForAggregation (const WifiMacHeader &hdr) |
805 { | 803 { |
806 Mac48Address retval; | 804 Mac48Address retval; |
807 if (m_typeOfStation == AP || m_typeOfStation == ADHOC_STA) | 805 if (m_typeOfStation == AP || m_typeOfStation == ADHOC_STA) |
808 { | 806 { |
809 retval = hdr.GetAddr1 (); | 807 retval = hdr.GetAddr1 (); |
810 } | 808 } |
811 else | 809 else |
812 { | 810 { |
813 retval = hdr.GetAddr3 (); | 811 retval = hdr.GetAddr3 (); |
814 } | 812 } |
815 return retval; | 813 return retval; |
816 } | 814 } |
817 | 815 |
818 void | 816 void |
819 EdcaTxopN::SetMsduAggregator (Ptr<MsduAggregator> aggr) | 817 EdcaTxopN::SetMsduAggregator (Ptr<MsduAggregator> aggr) |
820 { | 818 { |
821 m_aggregator = aggr; | 819 m_aggregator = aggr; |
822 } | 820 } |
823 | 821 |
824 void | 822 void |
825 EdcaTxopN::PushFront (Ptr<const Packet> packet, WifiMacHeader const &hdr) | 823 EdcaTxopN::PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr) |
826 { | 824 { |
827 NS_LOG_FUNCTION (this << packet << &hdr); | 825 NS_LOG_FUNCTION (this << packet << &hdr); |
828 WifiMacTrailer fcs; | 826 WifiMacTrailer fcs; |
829 uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.
GetSerializedSize (); | 827 uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.
GetSerializedSize (); |
830 WifiRemoteStation *station = GetStation (hdr.GetAddr1 ()); | 828 WifiRemoteStation *station = GetStation (hdr.GetAddr1 ()); |
831 station->PrepareForQueue (packet, fullPacketSize); | 829 station->PrepareForQueue (packet, fullPacketSize); |
832 m_queue->PushFront (packet, hdr); | 830 m_queue->PushFront (packet, hdr); |
833 StartAccessIfNeeded (); | 831 StartAccessIfNeeded (); |
834 } | 832 } |
835 | 833 |
836 void | 834 void |
837 EdcaTxopN::GotAddBaResponse (MgtAddBaResponseHeader const *respHdr, Mac48Address
recipient) | 835 EdcaTxopN::GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address
recipient) |
838 { | 836 { |
839 NS_LOG_FUNCTION (this); | 837 NS_LOG_FUNCTION (this); |
840 MY_DEBUG ("received ADDBA response from "<<recipient); | 838 MY_DEBUG ("received ADDBA response from "<<recipient); |
841 uint8_t tid = respHdr->GetTid (); | 839 uint8_t tid = respHdr->GetTid (); |
842 if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgr
eement::PENDING)) | 840 if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgr
eement::PENDING)) |
843 { | 841 { |
844 if (respHdr->GetStatusCode ().IsSuccess ()) | 842 if (respHdr->GetStatusCode ().IsSuccess ()) |
845 { | 843 { |
846 MY_DEBUG ("block ack agreement established with "<<recipient); | 844 MY_DEBUG ("block ack agreement established with "<<recipient); |
847 m_baManager->UpdateAgreement (respHdr, recipient); | 845 m_baManager->UpdateAgreement (respHdr, recipient); |
848 } | 846 } |
849 else | 847 else |
850 { | 848 { |
851 MY_DEBUG ("discard ADDBA response"<<recipient); | 849 MY_DEBUG ("discard ADDBA response"<<recipient); |
852 m_baManager->NotifyAgreementUnsuccessful (recipient, tid); | 850 m_baManager->NotifyAgreementUnsuccessful (recipient, tid); |
853 } | 851 } |
854 } | 852 } |
855 RestartAccessIfNeeded (); | 853 RestartAccessIfNeeded (); |
856 } | 854 } |
857 | 855 |
858 void | 856 void |
859 EdcaTxopN::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient
) | 857 EdcaTxopN::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient
) |
860 { | 858 { |
861 NS_LOG_FUNCTION (this); | 859 NS_LOG_FUNCTION (this); |
862 MY_DEBUG ("received DELBA frame from="<<recipient); | 860 MY_DEBUG ("received DELBA frame from="<<recipient); |
863 m_baManager->TearDownBlockAck (recipient, delBaHdr->GetTid ()); | 861 m_baManager->TearDownBlockAck (recipient, delBaHdr->GetTid ()); |
864 } | 862 } |
865 | 863 |
866 void | 864 void |
867 EdcaTxopN::GotBlockAck (CtrlBAckResponseHeader const *blockAck, Mac48Address rec
ipient) | 865 EdcaTxopN::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address rec
ipient) |
868 { | 866 { |
869 MY_DEBUG ("got block ack from="<<recipient); | 867 MY_DEBUG ("got block ack from="<<recipient); |
870 m_baManager->NotifyGotBlockAck (blockAck, recipient); | 868 m_baManager->NotifyGotBlockAck (blockAck, recipient); |
871 m_currentPacket = 0; | 869 m_currentPacket = 0; |
872 m_dcf->ResetCw (); | 870 m_dcf->ResetCw (); |
873 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 871 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
874 RestartAccessIfNeeded (); | 872 RestartAccessIfNeeded (); |
875 } | 873 } |
876 | 874 |
877 void | 875 void |
(...skipping 15 matching lines...) Expand all Loading... |
893 | 891 |
894 void | 892 void |
895 EdcaTxopN::CompleteTx (void) | 893 EdcaTxopN::CompleteTx (void) |
896 { | 894 { |
897 if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) | 895 if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
898 { | 896 { |
899 if (!m_currentHdr.IsRetry ()) | 897 if (!m_currentHdr.IsRetry ()) |
900 { | 898 { |
901 m_baManager->StorePacket (m_currentPacket, m_currentHdr, m_currentPack
etTimestamp); | 899 m_baManager->StorePacket (m_currentPacket, m_currentHdr, m_currentPack
etTimestamp); |
902 } | 900 } |
903 Ptr<Packet> bar = m_baManager->NotifyMpduTransmission (m_currentHdr.GetAdd
r1 (), m_currentHdr.GetQosTid ()); | 901 m_baManager->NotifyMpduTransmission (m_currentHdr.GetAddr1 (), m_currentHd
r.GetQosTid ()); |
904 if (bar != 0) | |
905 { | |
906 QueueBlockAckRequest (bar, m_currentHdr.GetAddr1 ()); | |
907 } | |
908 //we are not waiting for an ack: transmission is completed | 902 //we are not waiting for an ack: transmission is completed |
909 m_currentPacket = 0; | 903 m_currentPacket = 0; |
910 m_dcf->ResetCw (); | 904 m_dcf->ResetCw (); |
911 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 905 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
912 StartAccessIfNeeded (); | 906 StartAccessIfNeeded (); |
913 } | 907 } |
914 } | 908 } |
915 | 909 |
916 bool | 910 bool |
917 EdcaTxopN::SetupBlockAckIfNeeded () | 911 EdcaTxopN::SetupBlockAckIfNeeded () |
918 { | 912 { |
919 uint8_t tid = m_currentHdr.GetQosTid (); | 913 uint8_t tid = m_currentHdr.GetQosTid (); |
920 Mac48Address recipient = m_currentHdr.GetAddr1 (); | 914 Mac48Address recipient = m_currentHdr.GetAddr1 (); |
921 | 915 |
922 uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::AD
DR1, recipient); | 916 uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::AD
DR1, recipient); |
923 | 917 |
924 if (packets >= m_blockAckThreshold) | 918 if (packets >= m_blockAckThreshold) |
925 { | 919 { |
926 /* Block ack setup */ | 920 /* Block ack setup */ |
927 uint16_t startingSequence = m_txMiddle->GetNextSeqNumberByTidAndAddress (t
id, recipient); | 921 uint16_t startingSequence = m_txMiddle->GetNextSeqNumberByTidAndAddress (t
id, recipient); |
928 SendAddBaRequest (recipient, tid, startingSequence, m_blockAckInactivityTi
meout, true); | 922 SendAddBaRequest (recipient, tid, startingSequence, m_blockAckInactivityTi
meout, true); |
929 return true; | 923 return true; |
930 } | 924 } |
931 return false; | 925 return false; |
932 } | 926 } |
933 | 927 |
934 void | 928 void |
935 EdcaTxopN::SendBlockAckRequest (void) | 929 EdcaTxopN::SendBlockAckRequest (const struct Bar &bar) |
936 { | 930 { |
937 NS_LOG_FUNCTION (this); | 931 NS_LOG_FUNCTION (this); |
938 //For now assume immediate block ack. In the future, with delayed block ack | |
939 //support a control is needed. | |
940 bool immediate = true; | |
941 ·· | |
942 MacLowTransmissionParameters params; | |
943 params.DisableRts (); | |
944 params.DisableNextData (); | |
945 params.DisableOverrideDurationId (); | |
946 if (immediate) | |
947 { | |
948 if (m_blockAckType == BASIC_BLOCK_ACK) | |
949 { | |
950 params.EnableBasicBlockAck (); | |
951 } | |
952 else if (m_blockAckType == COMPRESSED_BLOCK_ACK) | |
953 { | |
954 params.EnableCompressedBlockAck (); | |
955 } | |
956 else if (m_blockAckType == MULTI_TID_BLOCK_ACK) | |
957 { | |
958 NS_FATAL_ERROR ("Multi-tid block ack is not supported"); | |
959 } | |
960 } | |
961 else | |
962 { | |
963 params.EnableAck (); | |
964 } | |
965 m_low->StartTransmission (m_currentPacket, &m_currentHdr, params, m_transmissi
onListener); | |
966 } | |
967 | |
968 void | |
969 EdcaTxopN::CompleteConfig (void) | |
970 { | |
971 NS_LOG_FUNCTION (this); | |
972 m_baManager->SetTxMiddle (m_txMiddle); | |
973 m_low->RegisterBlockAckListenerForAc (m_ac, m_blockAckListener); | |
974 m_baManager->SetBlockAckInactivityCallback (MakeCallback (&EdcaTxopN::SendDelb
aFrame, this)); | |
975 } | |
976 | |
977 void | |
978 EdcaTxopN::SetBlockAckThreshold (uint8_t threshold) | |
979 { | |
980 m_blockAckThreshold = threshold; | |
981 m_baManager->SetBlockAckThreshold (threshold); | |
982 } | |
983 | |
984 uint8_t | |
985 EdcaTxopN::GetBlockAckThreshold (void) const | |
986 { | |
987 return m_blockAckThreshold; | |
988 } | |
989 | |
990 void | |
991 EdcaTxopN::QueueBlockAckRequest (Ptr<const Packet> bar, Mac48Address recipient) | |
992 { | |
993 WifiMacHeader hdr; | 932 WifiMacHeader hdr; |
994 hdr.SetType (WIFI_MAC_CTL_BACKREQ); | 933 hdr.SetType (WIFI_MAC_CTL_BACKREQ); |
995 hdr.SetAddr1 (recipient); | 934 hdr.SetAddr1 (bar.recipient); |
996 hdr.SetAddr2 (m_low->GetAddress ()); | 935 hdr.SetAddr2 (m_low->GetAddress ()); |
997 hdr.SetAddr3 (m_low->GetBssid ()); | 936 hdr.SetAddr3 (m_low->GetBssid ()); |
998 hdr.SetDsNotTo (); | 937 hdr.SetDsNotTo (); |
999 hdr.SetDsNotFrom (); | 938 hdr.SetDsNotFrom (); |
1000 hdr.SetNoRetry (); | 939 hdr.SetNoRetry (); |
1001 hdr.SetNoMoreFragments (); | 940 hdr.SetNoMoreFragments (); |
1002 ·· | 941 |
1003 PushFront (bar, hdr); | 942 m_currentPacket = bar.bar; |
| 943 m_currentHdr = hdr; |
| 944 |
| 945 MacLowTransmissionParameters params; |
| 946 params.DisableRts (); |
| 947 params.DisableNextData (); |
| 948 params.DisableOverrideDurationId (); |
| 949 if (bar.immediate) |
| 950 { |
| 951 if (m_blockAckType == BASIC_BLOCK_ACK) |
| 952 { |
| 953 params.EnableBasicBlockAck (); |
| 954 } |
| 955 else if (m_blockAckType == COMPRESSED_BLOCK_ACK) |
| 956 { |
| 957 params.EnableCompressedBlockAck (); |
| 958 } |
| 959 else if (m_blockAckType == MULTI_TID_BLOCK_ACK) |
| 960 { |
| 961 NS_FATAL_ERROR ("Multi-tid block ack is not supported"); |
| 962 } |
| 963 } |
| 964 else |
| 965 { |
| 966 //Delayed block ack |
| 967 params.EnableAck (); |
| 968 } |
| 969 m_low->StartTransmission (m_currentPacket, &m_currentHdr, params, m_transmissi
onListener); |
| 970 } |
| 971 |
| 972 void |
| 973 EdcaTxopN::CompleteConfig (void) |
| 974 { |
| 975 NS_LOG_FUNCTION (this); |
| 976 m_baManager->SetTxMiddle (m_txMiddle); |
| 977 m_low->RegisterBlockAckListenerForAc (m_ac, m_blockAckListener); |
| 978 m_baManager->SetBlockAckInactivityCallback (MakeCallback (&EdcaTxopN::SendDelb
aFrame, this)); |
| 979 } |
| 980 |
| 981 void |
| 982 EdcaTxopN::SetBlockAckThreshold (uint8_t threshold) |
| 983 { |
| 984 m_blockAckThreshold = threshold; |
| 985 m_baManager->SetBlockAckThreshold (threshold); |
| 986 } |
| 987 |
| 988 uint8_t |
| 989 EdcaTxopN::GetBlockAckThreshold (void) const |
| 990 { |
| 991 return m_blockAckThreshold; |
1004 } | 992 } |
1005 | 993 |
1006 void | 994 void |
1007 EdcaTxopN::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startSeq,· | 995 EdcaTxopN::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startSeq,· |
1008 uint16_t timeout, bool immediateBAck) | 996 uint16_t timeout, bool immediateBAck) |
1009 { | 997 { |
1010 NS_LOG_FUNCTION (this); | 998 NS_LOG_FUNCTION (this); |
1011 MY_DEBUG ("sent ADDBA request to "<<dest); | 999 MY_DEBUG ("sent ADDBA request to "<<dest); |
1012 WifiMacHeader hdr; | 1000 WifiMacHeader hdr; |
1013 hdr.SetAction (); | 1001 hdr.SetAction (); |
1014 hdr.SetAddr1 (dest); | 1002 hdr.SetAddr1 (dest); |
1015 hdr.SetAddr2 (m_low->GetAddress ()); | 1003 hdr.SetAddr2 (m_low->GetAddress ()); |
1016 hdr.SetAddr3 (m_low->GetBssid ()); | 1004 hdr.SetAddr3 (m_low->GetAddress ()); |
1017 hdr.SetDsNotTo (); | 1005 hdr.SetDsNotTo (); |
1018 hdr.SetDsNotFrom (); | 1006 hdr.SetDsNotFrom (); |
| 1007 ·· |
| 1008 WifiActionHeader actionHdr; |
| 1009 WifiActionHeader::ActionValue action; |
| 1010 action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST; |
| 1011 actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action); |
| 1012 |
1019 Ptr<Packet> packet = Create<Packet> (); | 1013 Ptr<Packet> packet = Create<Packet> (); |
1020 /*Setting ADDBARequest header*/ | 1014 /*Setting ADDBARequest header*/ |
1021 MgtAddBaRequestHeader reqHdr; | 1015 MgtAddBaRequestHeader reqHdr; |
1022 reqHdr.SetAmsduSupport (true); | 1016 reqHdr.SetAmsduSupport (true); |
1023 if (immediateBAck) | 1017 if (immediateBAck) |
1024 { | 1018 { |
1025 reqHdr.SetImmediateBlockAck (); | 1019 reqHdr.SetImmediateBlockAck (); |
1026 } | 1020 } |
1027 else | 1021 else |
1028 { | 1022 { |
1029 reqHdr.SetDelayedBlockAck (); | 1023 reqHdr.SetDelayedBlockAck (); |
1030 } | 1024 } |
1031 reqHdr.SetTid (tid); | 1025 reqHdr.SetTid (tid); |
1032 /* For now we don't use buffer size field in the ADDBA request frame. The reci
pient | 1026 /* For now we don't use buffer size field in the ADDBA request frame. The reci
pient |
1033 * will choose how many packets it can receive under block ack. | 1027 * will choose how many packets it can receive under block ack. |
1034 */ | 1028 */ |
1035 reqHdr.SetBufferSize (0); | 1029 reqHdr.SetBufferSize (0); |
1036 reqHdr.SetTimeout (timeout); | 1030 reqHdr.SetTimeout (timeout); |
1037 reqHdr.SetStartingSequence (startSeq); | 1031 reqHdr.SetStartingSequence (startSeq); |
1038 | 1032 |
1039 m_baManager->CreateAgreement (&reqHdr, dest); | 1033 m_baManager->CreateAgreement (&reqHdr, dest); |
1040 ·· | 1034 ·· |
1041 packet->AddHeader (reqHdr); | 1035 packet->AddHeader (reqHdr); |
| 1036 packet->AddHeader (actionHdr); |
1042 ·· | 1037 ·· |
1043 m_currentPacket = packet; | 1038 m_currentPacket = packet; |
1044 m_currentHdr = hdr; | 1039 m_currentHdr = hdr; |
1045 | 1040 |
1046 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr); | 1041 uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr); |
1047 m_currentHdr.SetSequenceNumber (sequence); | 1042 m_currentHdr.SetSequenceNumber (sequence); |
1048 m_currentHdr.SetFragmentNumber (0); | 1043 m_currentHdr.SetFragmentNumber (0); |
1049 m_currentHdr.SetNoMoreFragments (); | 1044 m_currentHdr.SetNoMoreFragments (); |
1050 m_currentHdr.SetNoRetry (); | 1045 m_currentHdr.SetNoRetry (); |
1051 ·· | 1046 ·· |
1052 MacLowTransmissionParameters params; | 1047 MacLowTransmissionParameters params; |
1053 params.EnableAck (); | 1048 params.EnableAck (); |
1054 params.DisableRts (); | 1049 params.DisableRts (); |
1055 params.DisableNextData (); | 1050 params.DisableNextData (); |
1056 params.DisableOverrideDurationId (); | 1051 params.DisableOverrideDurationId (); |
1057 ·· | 1052 ·· |
1058 m_low->StartTransmission (m_currentPacket, &m_currentHdr, params,· | 1053 m_low->StartTransmission (m_currentPacket, &m_currentHdr, params,· |
1059 m_transmissionListener); | 1054 m_transmissionListener); |
1060 } | 1055 } |
1061 | 1056 |
1062 void | 1057 void |
1063 EdcaTxopN::SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator) | 1058 EdcaTxopN::SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator) |
1064 { | 1059 { |
1065 WifiMacHeader hdr; | 1060 WifiMacHeader hdr; |
1066 hdr.SetAction (); | 1061 hdr.SetAction (); |
1067 hdr.SetAddr1 (addr); | 1062 hdr.SetAddr1 (addr); |
1068 hdr.SetAddr2 (m_low->GetAddress ()); | 1063 hdr.SetAddr2 (m_low->GetAddress ()); |
1069 hdr.SetAddr3 (m_low->GetBssid ()); | 1064 hdr.SetAddr3 (m_low->GetAddress ()); |
1070 hdr.SetDsNotTo (); | 1065 hdr.SetDsNotTo (); |
1071 hdr.SetDsNotFrom (); | 1066 hdr.SetDsNotFrom (); |
1072 | 1067 |
1073 MgtDelBaHeader delbaHdr; | 1068 MgtDelBaHeader delbaHdr; |
1074 delbaHdr.SetTid (tid); | 1069 delbaHdr.SetTid (tid); |
1075 if (byOriginator) | 1070 if (byOriginator) |
1076 { | 1071 { |
1077 delbaHdr.SetByOriginator (); | 1072 delbaHdr.SetByOriginator (); |
1078 } | 1073 } |
1079 else | 1074 else |
1080 { | 1075 { |
1081 delbaHdr.SetByRecipient (); | 1076 delbaHdr.SetByRecipient (); |
1082 } | 1077 } |
| 1078 |
| 1079 WifiActionHeader actionHdr; |
| 1080 WifiActionHeader::ActionValue action; |
| 1081 action.blockAck = WifiActionHeader::BLOCK_ACK_DELBA; |
| 1082 actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action); |
| 1083 ·· |
1083 Ptr<Packet> packet = Create<Packet> (); | 1084 Ptr<Packet> packet = Create<Packet> (); |
1084 packet->AddHeader (delbaHdr); | 1085 packet->AddHeader (delbaHdr); |
| 1086 packet->AddHeader (actionHdr); |
1085 | 1087 |
1086 PushFront (packet, hdr); | 1088 PushFront (packet, hdr); |
1087 } | 1089 } |
1088 | 1090 |
1089 } //namespace ns3 | 1091 } //namespace ns3 |
LEFT | RIGHT |