OLD | NEW |
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, |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 * GNU General Public License for more details. | 13 * GNU General Public License for more details. |
14 * | 14 * |
15 * You should have received a copy of the GNU General Public License | 15 * You should have received a copy of the GNU General Public License |
16 * along with this program; if not, write to the Free Software | 16 * along with this program; if not, write to the Free Software |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 * | 18 * |
19 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> | 19 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
20 * Author: Mirko Banchi <mk.banchi@gmail.com> | 20 * Author: Mirko Banchi <mk.banchi@gmail.com> |
| 21 * Author: Ghada Badawy <gbadawy@gmail.com> |
21 */ | 22 */ |
22 #include "ns3/log.h" | 23 #include "ns3/log.h" |
23 #include "ns3/assert.h" | 24 #include "ns3/assert.h" |
24 #include "ns3/pointer.h" | 25 #include "ns3/pointer.h" |
25 | 26 |
26 #include "edca-txop-n.h" | 27 #include "edca-txop-n.h" |
27 #include "mac-low.h" | 28 #include "mac-low.h" |
28 #include "dcf-manager.h" | 29 #include "dcf-manager.h" |
29 #include "mac-tx-middle.h" | 30 #include "mac-tx-middle.h" |
30 #include "wifi-mac-trailer.h" | 31 #include "wifi-mac-trailer.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 m_txop->MissedCts (); | 89 m_txop->MissedCts (); |
89 } | 90 } |
90 virtual void GotAck (double snr, WifiMode txMode) | 91 virtual void GotAck (double snr, WifiMode txMode) |
91 { | 92 { |
92 m_txop->GotAck (snr, txMode); | 93 m_txop->GotAck (snr, txMode); |
93 } | 94 } |
94 virtual void MissedAck (void) | 95 virtual void MissedAck (void) |
95 { | 96 { |
96 m_txop->MissedAck (); | 97 m_txop->MissedAck (); |
97 } | 98 } |
98 virtual void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address
source) | 99 virtual void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address
source,WifiMode txMode) |
99 { | 100 { |
100 m_txop->GotBlockAck (blockAck, source); | 101 m_txop->GotBlockAck (blockAck, source,txMode); |
101 } | 102 } |
102 virtual void MissedBlockAck (void) | 103 virtual void MissedBlockAck (void) |
103 { | 104 { |
104 m_txop->MissedBlockAck (); | 105 m_txop->MissedBlockAck (); |
105 } | 106 } |
106 virtual void StartNext (void) | 107 virtual void StartNext (void) |
107 { | 108 { |
108 m_txop->StartNext (); | 109 m_txop->StartNext (); |
109 } | 110 } |
110 virtual void Cancel (void) | 111 virtual void Cancel (void) |
111 { | 112 { |
112 m_txop->Cancel (); | 113 m_txop->Cancel (); |
113 } | 114 } |
114 virtual void EndTxNoAck (void) | 115 virtual void EndTxNoAck (void) |
115 { | 116 { |
116 m_txop->EndTxNoAck (); | 117 m_txop->EndTxNoAck (); |
117 } | 118 } |
118 | 119 virtual Ptr<WifiMacQueue> GetQueue (void) |
| 120 {· |
| 121 return m_txop->GetEdcaQueue (); |
| 122 } |
119 private: | 123 private: |
120 EdcaTxopN *m_txop; | 124 EdcaTxopN *m_txop; |
121 }; | 125 }; |
122 | 126 |
123 class EdcaTxopN::BlockAckEventListener : public MacLowBlockAckEventListener | 127 class EdcaTxopN::BlockAckEventListener : public MacLowBlockAckEventListener |
124 { | 128 { |
125 public: | 129 public: |
126 BlockAckEventListener (EdcaTxopN * txop) | 130 BlockAckEventListener (EdcaTxopN * txop) |
127 : MacLowBlockAckEventListener (), | 131 : MacLowBlockAckEventListener (), |
128 m_txop (txop) { | 132 m_txop (txop) { |
129 } | 133 } |
130 virtual ~BlockAckEventListener () {} | 134 virtual ~BlockAckEventListener () {} |
131 | 135 |
132 virtual void BlockAckInactivityTimeout (Mac48Address address, uint8_t tid) | 136 virtual void BlockAckInactivityTimeout (Mac48Address address, uint8_t tid) |
133 { | 137 { |
134 m_txop->SendDelbaFrame (address, tid, false); | 138 m_txop->SendDelbaFrame (address, tid, false); |
135 } | 139 } |
136 | 140 virtual Ptr<WifiMacQueue> GetQueue (void) |
| 141 {· |
| 142 return m_txop->GetEdcaQueue (); |
| 143 } |
| 144 virtual void CompleteTransfer (Mac48Address recipient, uint8_t tid) |
| 145 { |
| 146 m_txop->CompleteAmpduTransfer(recipient, tid); |
| 147 } |
| 148 virtual void SetAmpdu(bool ampdu) |
| 149 { |
| 150 return m_txop->SetAmpduExist(ampdu); |
| 151 } |
| 152 virtual void CompleteMpduTx(Ptr<const Packet> packet, WifiMacHeader hdr, Time
tstamp) |
| 153 { |
| 154 m_txop->CompleteMpduTx(packet,hdr,tstamp); |
| 155 } |
| 156 virtual uint16_t GetNextSequenceNumberfor (WifiMacHeader *hdr) |
| 157 { |
| 158 return m_txop->GetNextSequenceNumberfor (hdr); |
| 159 } |
| 160 virtual uint16_t PeekNextSequenceNumberfor (WifiMacHeader *hdr) |
| 161 { |
| 162 return m_txop->PeekNextSequenceNumberfor (hdr); |
| 163 } |
| 164 virtual Ptr<const Packet> PeekNextPacketInBaQueue (WifiMacHeader &Hdr) |
| 165 { |
| 166 return m_txop->PeekNextRetransmitPacket(Hdr); |
| 167 } |
| 168 virtual void RemoveFromBaQueue (Ptr<const Packet> packet) |
| 169 { |
| 170 m_txop->RemoveRetransmitPacket(packet); |
| 171 } |
| 172 virtual bool GetBlockAckAgreementExists (Mac48Address address, uint8_t tid) |
| 173 { |
| 174 return m_txop->GetBaAgreementExists (address,tid); |
| 175 } |
| 176 virtual uint32_t GetNOutstandingPackets (Mac48Address address, uint8_t tid) |
| 177 { |
| 178 return m_txop->GetNOutstandingPacketsInBa (address, tid); |
| 179 } |
| 180 virtual uint32_t GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid)
const |
| 181 { |
| 182 return m_txop->GetNRetryNeededPackets (recipient, tid); |
| 183 } |
137 private: | 184 private: |
138 EdcaTxopN *m_txop; | 185 EdcaTxopN *m_txop; |
139 }; | 186 }; |
140 | 187 |
141 NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN); | 188 NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN); |
142 | 189 |
143 TypeId | 190 TypeId |
144 EdcaTxopN::GetTypeId (void) | 191 EdcaTxopN::GetTypeId (void) |
145 { | 192 { |
146 static TypeId tid = TypeId ("ns3::EdcaTxopN") | 193 static TypeId tid = TypeId ("ns3::EdcaTxopN") |
147 .SetParent (ns3::Dcf::GetTypeId ()) | 194 .SetParent (ns3::Dcf::GetTypeId ()) |
148 .AddConstructor<EdcaTxopN> () | 195 .AddConstructor<EdcaTxopN> () |
149 .AddAttribute ("BlockAckThreshold", "If number of packets in this queue reac
hes this value,\ | 196 .AddAttribute ("BlockAckThreshold", "If number of packets in this queue reac
hes this value,\ |
150 block ack mechanism is used. If this va
lue is 0, block ack is never used.", | 197 block ack mechanism is used. If this va
lue is 0, block ack is never used.", |
151 UintegerValue (0), | 198 UintegerValue (0), |
152 MakeUintegerAccessor (&EdcaTxopN::SetBlockAckThreshold, | 199 MakeUintegerAccessor (&EdcaTxopN::SetBlockAckThreshold, |
153 &EdcaTxopN::GetBlockAckThreshold), | 200 &EdcaTxopN::GetBlockAckThreshold), |
154 MakeUintegerChecker<uint8_t> (0, 64)) | 201 MakeUintegerChecker<uint8_t> (0, 64)) |
155 .AddAttribute ("BlockAckInactivityTimeout", "Represents max time (blocks of
1024 micro seconds) allowed for block ack\ | 202 .AddAttribute ("BlockAckInactivityTimeout", "Represents max time (blocks of
1024 micro seconds) allowed for block ack\ |
156 inactivity. If this value isn't
equal to 0 a timer start after that a\ | 203 inactivity. If this value isn't
equal to 0 a timer start after that a\ |
157 block ack setup is completed an
d will be reset every time that a block\ | 204 block ack setup is completed an
d will be reset every time that a block\ |
158 ack frame is received. If this
value is 0, block ack inactivity timeout won't be used.", | 205 ack frame is received. If this
value is 0, block ack inactivity timeout won't be used.", |
159 UintegerValue (0), | 206 UintegerValue (0), |
160 MakeUintegerAccessor (&EdcaTxopN::SetBlockAckInactivityTimeou
t), | 207 MakeUintegerAccessor (&EdcaTxopN::SetBlockAckInactivityTimeou
t), |
161 MakeUintegerChecker<uint16_t> ()) | 208 MakeUintegerChecker<uint16_t> ()) |
162 .AddAttribute ("Queue", "The WifiMacQueue object", | 209 .AddAttribute ("Queue", "The WifiMacQueue object", |
163 PointerValue (), | 210 PointerValue (), |
164 MakePointerAccessor (&EdcaTxopN::GetQueue), | 211 MakePointerAccessor (&EdcaTxopN::GetEdcaQueue), |
165 MakePointerChecker<WifiMacQueue> ()) | 212 MakePointerChecker<WifiMacQueue> ()) |
166 ; | 213 ; |
167 return tid; | 214 return tid; |
168 } | 215 } |
169 | 216 |
170 EdcaTxopN::EdcaTxopN () | 217 EdcaTxopN::EdcaTxopN () |
171 : m_manager (0), | 218 : m_manager (0), |
172 m_currentPacket (0), | 219 m_currentPacket (0), |
173 m_aggregator (0), | 220 m_aggregator (0), |
174 m_blockAckType (COMPRESSED_BLOCK_ACK) | 221 m_blockAckType (COMPRESSED_BLOCK_ACK) |
175 { | 222 { |
176 NS_LOG_FUNCTION (this); | 223 NS_LOG_FUNCTION (this); |
177 m_transmissionListener = new EdcaTxopN::TransmissionListener (this); | 224 m_transmissionListener = new EdcaTxopN::TransmissionListener (this); |
178 m_blockAckListener = new EdcaTxopN::BlockAckEventListener (this); | 225 m_blockAckListener = new EdcaTxopN::BlockAckEventListener (this); |
179 m_dcf = new EdcaTxopN::Dcf (this); | 226 m_dcf = new EdcaTxopN::Dcf (this); |
180 m_queue = CreateObject<WifiMacQueue> (); | 227 m_queue = CreateObject<WifiMacQueue> (); |
181 m_rng = new RealRandomStream (); | 228 m_rng = new RealRandomStream (); |
182 m_qosBlockedDestinations = new QosBlockedDestinations (); | 229 m_qosBlockedDestinations = new QosBlockedDestinations (); |
183 m_baManager = new BlockAckManager (); | 230 m_baManager = new BlockAckManager (); |
184 m_baManager->SetQueue (m_queue); | 231 m_baManager->SetQueue (m_queue); |
185 m_baManager->SetBlockAckType (m_blockAckType); | 232 m_baManager->SetBlockAckType (m_blockAckType); |
186 m_baManager->SetBlockDestinationCallback (MakeCallback (&QosBlockedDestination
s::Block, m_qosBlockedDestinations)); | 233 m_baManager->SetBlockDestinationCallback (MakeCallback (&QosBlockedDestination
s::Block, m_qosBlockedDestinations)); |
187 m_baManager->SetUnblockDestinationCallback (MakeCallback (&QosBlockedDestinati
ons::Unblock, m_qosBlockedDestinations)); | 234 m_baManager->SetUnblockDestinationCallback (MakeCallback (&QosBlockedDestinati
ons::Unblock, m_qosBlockedDestinations)); |
188 m_baManager->SetMaxPacketDelay (m_queue->GetMaxDelay ()); | 235 m_baManager->SetMaxPacketDelay (m_queue->GetMaxDelay ()); |
| 236 m_baManager->SetTxOkCallback (MakeCallback (&EdcaTxopN::BaTxOk, this)); |
189 } | 237 } |
190 | 238 |
191 EdcaTxopN::~EdcaTxopN () | 239 EdcaTxopN::~EdcaTxopN () |
192 { | 240 { |
193 NS_LOG_FUNCTION (this); | 241 NS_LOG_FUNCTION (this); |
194 } | 242 } |
195 | 243 |
196 void | 244 void |
197 EdcaTxopN::DoDispose (void) | 245 EdcaTxopN::DoDispose (void) |
198 { | 246 { |
(...skipping 10 matching lines...) Expand all Loading... |
209 m_transmissionListener = 0; | 257 m_transmissionListener = 0; |
210 m_dcf = 0; | 258 m_dcf = 0; |
211 m_rng = 0; | 259 m_rng = 0; |
212 m_qosBlockedDestinations = 0; | 260 m_qosBlockedDestinations = 0; |
213 m_baManager = 0; | 261 m_baManager = 0; |
214 m_blockAckListener = 0; | 262 m_blockAckListener = 0; |
215 m_txMiddle = 0; | 263 m_txMiddle = 0; |
216 m_aggregator = 0; | 264 m_aggregator = 0; |
217 } | 265 } |
218 | 266 |
| 267 bool |
| 268 EdcaTxopN::GetBaAgreementExists (Mac48Address address, uint8_t tid) |
| 269 { |
| 270 return m_baManager->ExistsAgreement (address, tid);· |
| 271 } |
| 272 uint32_t |
| 273 EdcaTxopN::GetNOutstandingPacketsInBa (Mac48Address address, uint8_t tid) |
| 274 { |
| 275 return m_baManager->GetNBufferedPackets (address, tid);· |
| 276 } |
| 277 uint32_t |
| 278 EdcaTxopN::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const |
| 279 { |
| 280 return m_baManager->GetNRetryNeededPackets (recipient,tid); |
| 281 } |
| 282 void |
| 283 EdcaTxopN::CompleteAmpduTransfer(Mac48Address recipient, uint8_t tid) |
| 284 { |
| 285 m_baManager->CompleteAmpduExchange(recipient, tid); |
| 286 } |
219 void | 287 void |
220 EdcaTxopN::SetManager (DcfManager *manager) | 288 EdcaTxopN::SetManager (DcfManager *manager) |
221 { | 289 { |
222 NS_LOG_FUNCTION (this << manager); | 290 NS_LOG_FUNCTION (this << manager); |
223 m_manager = manager; | 291 m_manager = manager; |
224 m_manager->Add (m_dcf); | 292 m_manager->Add (m_dcf); |
225 } | 293 } |
226 | 294 |
227 void | 295 void |
228 EdcaTxopN::SetTxOkCallback (TxOk callback) | 296 EdcaTxopN::SetTxOkCallback (TxOk callback) |
(...skipping 23 matching lines...) Expand all Loading... |
252 } | 320 } |
253 | 321 |
254 enum TypeOfStation | 322 enum TypeOfStation |
255 EdcaTxopN::GetTypeOfStation (void) const | 323 EdcaTxopN::GetTypeOfStation (void) const |
256 { | 324 { |
257 NS_LOG_FUNCTION (this); | 325 NS_LOG_FUNCTION (this); |
258 return m_typeOfStation; | 326 return m_typeOfStation; |
259 } | 327 } |
260 | 328 |
261 Ptr<WifiMacQueue > | 329 Ptr<WifiMacQueue > |
262 EdcaTxopN::GetQueue () const | 330 EdcaTxopN::GetEdcaQueue () const |
263 { | 331 { |
264 NS_LOG_FUNCTION (this); | 332 NS_LOG_FUNCTION (this); |
265 return m_queue; | 333 return m_queue; |
266 } | 334 } |
267 | 335 |
268 void | 336 void |
269 EdcaTxopN::SetMinCw (uint32_t minCw) | 337 EdcaTxopN::SetMinCw (uint32_t minCw) |
270 { | 338 { |
271 NS_LOG_FUNCTION (this << minCw); | 339 NS_LOG_FUNCTION (this << minCw); |
272 m_dcf->SetCwMin (minCw); | 340 m_dcf->SetCwMin (minCw); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 m_low = low; | 396 m_low = low; |
329 } | 397 } |
330 | 398 |
331 bool | 399 bool |
332 EdcaTxopN::NeedsAccess (void) const | 400 EdcaTxopN::NeedsAccess (void) const |
333 { | 401 { |
334 NS_LOG_FUNCTION (this); | 402 NS_LOG_FUNCTION (this); |
335 return !m_queue->IsEmpty () || m_currentPacket != 0 || m_baManager->HasPackets
(); | 403 return !m_queue->IsEmpty () || m_currentPacket != 0 || m_baManager->HasPackets
(); |
336 } | 404 } |
337 | 405 |
| 406 uint16_t· |
| 407 EdcaTxopN::GetNextSequenceNumberfor (WifiMacHeader *hdr) |
| 408 { |
| 409 return m_txMiddle->GetNextSequenceNumberfor (hdr); |
| 410 } |
| 411 |
| 412 uint16_t· |
| 413 EdcaTxopN::PeekNextSequenceNumberfor (WifiMacHeader *hdr) |
| 414 { |
| 415 return m_txMiddle->PeekNextSequenceNumberfor (hdr); |
| 416 } |
| 417 |
| 418 Ptr<const Packet> |
| 419 EdcaTxopN::PeekNextRetransmitPacket (WifiMacHeader &Hdr) |
| 420 { |
| 421 return m_baManager->PeekNextPacket (Hdr); |
| 422 } |
| 423 |
| 424 void |
| 425 EdcaTxopN::RemoveRetransmitPacket (Ptr<const Packet> p) |
| 426 { |
| 427 m_baManager->RemovePacket (p); |
| 428 } |
| 429 |
338 void | 430 void |
339 EdcaTxopN::NotifyAccessGranted (void) | 431 EdcaTxopN::NotifyAccessGranted (void) |
340 { | 432 { |
341 NS_LOG_FUNCTION (this); | 433 NS_LOG_FUNCTION (this); |
342 if (m_currentPacket == 0) | 434 if (m_currentPacket == 0) |
343 { | 435 { |
344 if (m_queue->IsEmpty () && !m_baManager->HasPackets ()) | 436 if (m_queue->IsEmpty () && !m_baManager->HasPackets ()) |
345 { | 437 { |
346 NS_LOG_DEBUG ("queue is empty"); | 438 NS_LOG_DEBUG ("queue is empty"); |
347 return; | 439 return; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 { | 526 { |
435 NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ()); | 527 NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ()); |
436 params.EnableNextData (GetNextFragmentSize ()); | 528 params.EnableNextData (GetNextFragmentSize ()); |
437 } | 529 } |
438 m_low->StartTransmission (fragment, &hdr, params, | 530 m_low->StartTransmission (fragment, &hdr, params, |
439 m_transmissionListener); | 531 m_transmissionListener); |
440 } | 532 } |
441 else | 533 else |
442 { | 534 { |
443 WifiMacHeader peekedHdr; | 535 WifiMacHeader peekedHdr; |
| 536 Time tstamp; |
444 if (m_currentHdr.IsQosData () | 537 if (m_currentHdr.IsQosData () |
445 && m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTi
d (), | 538 && m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTi
d (), |
446 WifiMacHeader::ADDR1, m_currentHd
r.GetAddr1 ()) | 539 WifiMacHeader::ADDR1, m_currentHd
r.GetAddr1 (), &tstamp) |
447 && !m_currentHdr.GetAddr1 ().IsBroadcast () | 540 && !m_currentHdr.GetAddr1 ().IsBroadcast () |
448 && m_aggregator != 0 && !m_currentHdr.IsRetry ()) | 541 && m_aggregator != 0 && !m_currentHdr.IsRetry ()) |
449 { | 542 { |
450 /* here is performed aggregation */ | 543 /* here is performed aggregation */ |
451 Ptr<Packet> currentAggregatedPacket = Create<Packet> (); | 544 Ptr<Packet> currentAggregatedPacket = Create<Packet> (); |
452 m_aggregator->Aggregate (m_currentPacket, currentAggregatedPacket, | 545 m_aggregator->Aggregate (m_currentPacket, currentAggregatedPacket, |
453 MapSrcAddressForAggregation (peekedHdr), | 546 MapSrcAddressForAggregation (peekedHdr), |
454 MapDestAddressForAggregation (peekedHdr))
; | 547 MapDestAddressForAggregation (peekedHdr))
; |
455 bool aggregated = false; | 548 bool aggregated = false; |
456 bool isAmsdu = false; | 549 bool isAmsdu = false; |
457 Ptr<const Packet> peekedPacket = m_queue->PeekByTidAndAddress (&pe
ekedHdr, m_currentHdr.GetQosTid (), | 550 Ptr<const Packet> peekedPacket = m_queue->PeekByTidAndAddress (&pe
ekedHdr, m_currentHdr.GetQosTid (), |
458 Wif
iMacHeader::ADDR1, | 551 Wif
iMacHeader::ADDR1, |
459 m_c
urrentHdr.GetAddr1 ()); | 552 m_c
urrentHdr.GetAddr1 (), &tstamp); |
460 while (peekedPacket != 0) | 553 while (peekedPacket != 0) |
461 { | 554 { |
462 aggregated = m_aggregator->Aggregate (peekedPacket, currentAgg
regatedPacket, | 555 aggregated = m_aggregator->Aggregate (peekedPacket, currentAgg
regatedPacket, |
463 MapSrcAddressForAggregat
ion (peekedHdr), | 556 MapSrcAddressForAggregat
ion (peekedHdr), |
464 MapDestAddressForAggrega
tion (peekedHdr)); | 557 MapDestAddressForAggrega
tion (peekedHdr)); |
465 if (aggregated) | 558 if (aggregated) |
466 { | 559 { |
467 isAmsdu = true; | 560 isAmsdu = true; |
468 m_queue->Remove (peekedPacket); | 561 m_queue->Remove (peekedPacket); |
469 } | 562 } |
470 else | 563 else |
471 { | 564 { |
472 break; | 565 break; |
473 } | 566 } |
474 peekedPacket = m_queue->PeekByTidAndAddress (&peekedHdr, m_cur
rentHdr.GetQosTid (), | 567 peekedPacket = m_queue->PeekByTidAndAddress (&peekedHdr, m_cur
rentHdr.GetQosTid (), |
475 WifiMacHeader::AD
DR1, m_currentHdr.GetAddr1 ()); | 568 WifiMacHeader::AD
DR1, m_currentHdr.GetAddr1 (), &tstamp); |
476 } | 569 } |
477 if (isAmsdu) | 570 if (isAmsdu) |
478 { | 571 { |
479 m_currentHdr.SetQosAmsdu (); | 572 m_currentHdr.SetQosAmsdu (); |
480 m_currentHdr.SetAddr3 (m_low->GetBssid ()); | 573 m_currentHdr.SetAddr3 (m_low->GetBssid ()); |
481 m_currentPacket = currentAggregatedPacket; | 574 m_currentPacket = currentAggregatedPacket; |
482 currentAggregatedPacket = 0; | 575 currentAggregatedPacket = 0; |
483 NS_LOG_DEBUG ("tx unicast A-MSDU"); | 576 NS_LOG_DEBUG ("tx unicast A-MSDU"); |
484 } | 577 } |
485 } | 578 } |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 } | 731 } |
639 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 732 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
640 RestartAccessIfNeeded (); | 733 RestartAccessIfNeeded (); |
641 } | 734 } |
642 | 735 |
643 void | 736 void |
644 EdcaTxopN::MissedBlockAck (void) | 737 EdcaTxopN::MissedBlockAck (void) |
645 { | 738 { |
646 NS_LOG_FUNCTION (this); | 739 NS_LOG_FUNCTION (this); |
647 NS_LOG_DEBUG ("missed block ack"); | 740 NS_LOG_DEBUG ("missed block ack"); |
648 //should i report this to station addressed by ADDR1? | 741 if (NeedBarRetransmission()) |
649 NS_LOG_DEBUG ("Retransmit block ack request"); | 742 { |
650 m_currentHdr.SetRetry (); | 743 if (!GetAmpduExist()) |
651 m_dcf->UpdateFailedCw (); | 744 { |
| 745 //should i report this to station addressed by ADDR1? |
| 746 NS_LOG_DEBUG ("Retransmit block ack request");· |
| 747 m_currentHdr.SetRetry ();·· |
| 748 } |
| 749 else |
| 750 { |
| 751 //standard says when loosing a BlockAck originator may send a BAR page
139 |
| 752 NS_LOG_DEBUG ("Transmit Block Ack Request");· |
| 753 CtrlBAckRequestHeader reqHdr; |
| 754 reqHdr.SetType (COMPRESSED_BLOCK_ACK); |
| 755 uint8_t tid; |
| 756 if (m_currentHdr.IsQosData()) |
| 757 { |
| 758 tid= m_currentHdr.GetQosTid (); |
| 759 reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ()); |
| 760 } |
| 761 else if (m_currentHdr.IsBlockAckReq()) |
| 762 { |
| 763 CtrlBAckRequestHeader baReqHdr; |
| 764 m_currentPacket->PeekHeader (baReqHdr); |
| 765 tid=baReqHdr.GetTidInfo(); |
| 766 reqHdr.SetStartingSequence (baReqHdr.GetStartingSequence ()); |
| 767 } |
| 768 else if (m_currentHdr.IsBlockAck()) |
| 769 { |
| 770 CtrlBAckResponseHeader baRespHdr; |
| 771 m_currentPacket->PeekHeader (baRespHdr); |
| 772 tid=baRespHdr.GetTidInfo(); |
| 773 reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ()); |
| 774 }··· |
| 775 reqHdr.SetTidInfo (tid); |
| 776 reqHdr.SetHtImmediateAck(true); |
| 777 Ptr<Packet> bar = Create<Packet> (); |
| 778 bar->AddHeader (reqHdr); |
| 779 Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmedi
ateAck()); |
| 780 m_currentBar=request; |
| 781 WifiMacHeader hdr; |
| 782 hdr.SetType (WIFI_MAC_CTL_BACKREQ); |
| 783 hdr.SetAddr1 (request.recipient); |
| 784 hdr.SetAddr2 (m_low->GetAddress ()); |
| 785 hdr.SetAddr3 (m_low->GetBssid ()); |
| 786 hdr.SetDsNotTo (); |
| 787 hdr.SetDsNotFrom (); |
| 788 hdr.SetNoRetry (); |
| 789 hdr.SetNoMoreFragments (); |
652 | 790 |
| 791 m_currentPacket = request.bar; |
| 792 m_currentHdr = hdr; |
| 793 } |
| 794 m_dcf->UpdateFailedCw (); |
| 795 } |
| 796 else· |
| 797 { |
| 798 NS_LOG_DEBUG ("Block Ack Request Fail"); |
| 799 ····· |
| 800 // to reset the dcf. |
| 801 m_currentPacket = 0; |
| 802 m_dcf->ResetCw (); |
| 803 } |
653 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 804 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
654 RestartAccessIfNeeded (); | 805 RestartAccessIfNeeded (); |
| 806 ···· |
655 } | 807 } |
656 | 808 |
657 Ptr<MsduAggregator> | 809 Ptr<MsduAggregator> |
658 EdcaTxopN::GetMsduAggregator (void) const | 810 EdcaTxopN::GetMsduAggregator (void) const |
659 { | 811 { |
660 return m_aggregator; | 812 return m_aggregator; |
661 } | 813 } |
662 | 814 |
663 void | 815 void |
664 EdcaTxopN::RestartAccessIfNeeded (void) | 816 EdcaTxopN::RestartAccessIfNeeded (void) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 } | 853 } |
702 | 854 |
703 bool | 855 bool |
704 EdcaTxopN::NeedDataRetransmission (void) | 856 EdcaTxopN::NeedDataRetransmission (void) |
705 { | 857 { |
706 NS_LOG_FUNCTION (this); | 858 NS_LOG_FUNCTION (this); |
707 return m_stationManager->NeedDataRetransmission (m_currentHdr.GetAddr1 (), &m_
currentHdr, | 859 return m_stationManager->NeedDataRetransmission (m_currentHdr.GetAddr1 (), &m_
currentHdr, |
708 m_currentPacket); | 860 m_currentPacket); |
709 } | 861 } |
710 | 862 |
| 863 bool |
| 864 EdcaTxopN::NeedBarRetransmission (void) |
| 865 { |
| 866 uint8_t tid; |
| 867 uint16_t seqNumber; |
| 868 if (m_currentHdr.IsQosData()) |
| 869 { |
| 870 tid = m_currentHdr.GetQosTid (); |
| 871 seqNumber = m_currentHdr.GetSequenceNumber (); |
| 872 } |
| 873 else if (m_currentHdr.IsBlockAckReq()) |
| 874 { |
| 875 CtrlBAckRequestHeader baReqHdr; |
| 876 m_currentPacket->PeekHeader (baReqHdr); |
| 877 tid = baReqHdr.GetTidInfo(); |
| 878 seqNumber = baReqHdr.GetStartingSequence (); |
| 879 } |
| 880 else if (m_currentHdr.IsBlockAck()) |
| 881 { |
| 882 CtrlBAckResponseHeader baRespHdr; |
| 883 m_currentPacket->PeekHeader (baRespHdr); |
| 884 tid=baRespHdr.GetTidInfo(); |
| 885 seqNumber = m_currentHdr.GetSequenceNumber (); |
| 886 }·· |
| 887 return m_baManager->NeedBarRetransmission (tid,seqNumber,m_currentHdr.GetAddr1
() ); |
| 888 } |
| 889 |
711 void | 890 void |
712 EdcaTxopN::NextFragment (void) | 891 EdcaTxopN::NextFragment (void) |
713 { | 892 { |
714 NS_LOG_FUNCTION (this); | 893 NS_LOG_FUNCTION (this); |
715 m_fragmentNumber++; | 894 m_fragmentNumber++; |
716 } | 895 } |
717 | 896 |
718 void | 897 void |
719 EdcaTxopN::StartNext (void) | 898 EdcaTxopN::StartNext (void) |
720 { | 899 { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 | 1080 |
902 void | 1081 void |
903 EdcaTxopN::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient
) | 1082 EdcaTxopN::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient
) |
904 { | 1083 { |
905 NS_LOG_FUNCTION (this << delBaHdr << recipient); | 1084 NS_LOG_FUNCTION (this << delBaHdr << recipient); |
906 NS_LOG_DEBUG ("received DELBA frame from=" << recipient); | 1085 NS_LOG_DEBUG ("received DELBA frame from=" << recipient); |
907 m_baManager->TearDownBlockAck (recipient, delBaHdr->GetTid ()); | 1086 m_baManager->TearDownBlockAck (recipient, delBaHdr->GetTid ()); |
908 } | 1087 } |
909 | 1088 |
910 void | 1089 void |
911 EdcaTxopN::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address rec
ipient) | 1090 EdcaTxopN::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address rec
ipient, WifiMode txMode) |
912 { | 1091 { |
913 NS_LOG_FUNCTION (this << blockAck << recipient); | 1092 NS_LOG_FUNCTION (this << blockAck << recipient); |
914 NS_LOG_DEBUG ("got block ack from=" << recipient); | 1093 NS_LOG_DEBUG ("got block ack from=" << recipient); |
915 m_baManager->NotifyGotBlockAck (blockAck, recipient); | 1094 m_baManager->SetWifiRemoteStationManager(m_stationManager); |
| 1095 m_baManager->NotifyGotBlockAck (blockAck, recipient, txMode); |
| 1096 if (!m_txOkCallback.IsNull ()) |
| 1097 { |
| 1098 m_txOkCallback (m_currentHdr); |
| 1099 } |
916 m_currentPacket = 0; | 1100 m_currentPacket = 0; |
917 m_dcf->ResetCw (); | 1101 m_dcf->ResetCw (); |
918 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 1102 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
919 RestartAccessIfNeeded (); | 1103 RestartAccessIfNeeded (); |
920 } | 1104 } |
921 | 1105 |
922 void | 1106 void |
923 EdcaTxopN::VerifyBlockAck (void) | 1107 EdcaTxopN::VerifyBlockAck (void) |
924 { | 1108 { |
925 NS_LOG_FUNCTION (this); | 1109 NS_LOG_FUNCTION (this); |
926 uint8_t tid = m_currentHdr.GetQosTid (); | 1110 uint8_t tid = m_currentHdr.GetQosTid (); |
927 Mac48Address recipient = m_currentHdr.GetAddr1 (); | 1111 Mac48Address recipient = m_currentHdr.GetAddr1 (); |
928 uint16_t sequence = m_currentHdr.GetSequenceNumber (); | 1112 uint16_t sequence = m_currentHdr.GetSequenceNumber (); |
929 if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgr
eement::INACTIVE)) | 1113 if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgr
eement::INACTIVE)) |
930 { | 1114 { |
931 m_baManager->SwitchToBlockAckIfNeeded (recipient, tid, sequence); | 1115 m_baManager->SwitchToBlockAckIfNeeded (recipient, tid, sequence); |
932 } | 1116 } |
933 if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgr
eement::ESTABLISHED)) | 1117 if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgr
eement::ESTABLISHED)) |
934 { | 1118 { |
935 m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK); | 1119 m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK); |
936 } | 1120 } |
937 } | 1121 } |
938 | 1122 |
| 1123 bool EdcaTxopN::GetAmpduExist(void) |
| 1124 { |
| 1125 return m_ampduExist; |
| 1126 } |
| 1127 · |
| 1128 void EdcaTxopN::SetAmpduExist(bool ampdu) |
| 1129 { |
| 1130 m_ampduExist=ampdu; |
| 1131 } |
| 1132 |
939 void | 1133 void |
940 EdcaTxopN::CompleteTx (void) | 1134 EdcaTxopN::CompleteTx (void) |
941 { | 1135 { |
942 NS_LOG_FUNCTION (this); | 1136 NS_LOG_FUNCTION (this); |
943 if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) | 1137 if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
944 { | 1138 { |
945 if (!m_currentHdr.IsRetry ()) | 1139 if (!m_currentHdr.IsRetry ()) |
946 { | 1140 { |
947 m_baManager->StorePacket (m_currentPacket, m_currentHdr, m_currentPack
etTimestamp); | 1141 m_baManager->StorePacket (m_currentPacket, m_currentHdr, m_currentPack
etTimestamp); |
948 } | 1142 } |
949 m_baManager->NotifyMpduTransmission (m_currentHdr.GetAddr1 (), m_currentHd
r.GetQosTid (), | 1143 m_baManager->NotifyMpduTransmission (m_currentHdr.GetAddr1 (), m_currentHd
r.GetQosTid (), |
950 m_txMiddle->GetNextSeqNumberByTidAndA
ddress (m_currentHdr.GetQosTid (), | 1144 m_txMiddle->GetNextSeqNumberByTidAndA
ddress (m_currentHdr.GetQosTid (), |
951
m_currentHdr.GetAddr1 ())); | 1145
m_currentHdr.GetAddr1 ()),WifiMacHeader::BLOCK_ACK); |
952 } | 1146 } |
953 } | 1147 } |
954 | 1148 |
| 1149 void |
| 1150 EdcaTxopN::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tst
amp) |
| 1151 { |
| 1152 if (!hdr.IsRetry ()) |
| 1153 { |
| 1154 m_baManager->StorePacket (packet, hdr, tstamp); |
| 1155 } |
| 1156 m_baManager->NotifyMpduTransmission (hdr.GetAddr1 (), hdr.GetQosTid (), |
| 1157 m_txMiddle->GetNextSeqNumberByTidAndA
ddress (hdr.GetQosTid (), |
| 1158
hdr.GetAddr1 ()), WifiMacHeader::NORMAL_ACK); |
| 1159 } |
| 1160 |
| 1161 |
955 bool | 1162 bool |
956 EdcaTxopN::SetupBlockAckIfNeeded () | 1163 EdcaTxopN::SetupBlockAckIfNeeded () |
957 { | 1164 { |
958 NS_LOG_FUNCTION (this); | 1165 NS_LOG_FUNCTION (this); |
959 uint8_t tid = m_currentHdr.GetQosTid (); | 1166 uint8_t tid = m_currentHdr.GetQosTid (); |
960 Mac48Address recipient = m_currentHdr.GetAddr1 (); | 1167 Mac48Address recipient = m_currentHdr.GetAddr1 (); |
961 | 1168 |
962 uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::AD
DR1, recipient); | 1169 uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::AD
DR1, recipient); |
963 | 1170 |
964 if (packets >= m_blockAckThreshold) | 1171 if (packets >= m_blockAckThreshold) |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1151 m_rng->AssignStreams (stream); | 1358 m_rng->AssignStreams (stream); |
1152 return 1; | 1359 return 1; |
1153 } | 1360 } |
1154 | 1361 |
1155 void | 1362 void |
1156 EdcaTxopN::DoInitialize () | 1363 EdcaTxopN::DoInitialize () |
1157 { | 1364 { |
1158 NS_LOG_FUNCTION (this); | 1365 NS_LOG_FUNCTION (this); |
1159 m_dcf->ResetCw (); | 1366 m_dcf->ResetCw (); |
1160 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); | 1367 m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
| 1368 SetAmpduExist(false); |
1161 ns3::Dcf::DoInitialize (); | 1369 ns3::Dcf::DoInitialize (); |
1162 } | 1370 } |
| 1371 |
| 1372 void |
| 1373 EdcaTxopN::BaTxOk (const WifiMacHeader &hdr) |
| 1374 { |
| 1375 NS_LOG_FUNCTION (this << hdr); |
| 1376 if (!m_txOkCallback.IsNull ()) |
| 1377 { |
| 1378 m_txOkCallback (m_currentHdr); |
| 1379 } |
| 1380 } |
1163 } // namespace ns3 | 1381 } // namespace ns3 |
OLD | NEW |