equal
deleted
inserted
replaced
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 |