|
|
| 168 |
{ |
168 |
{ |
| 169 |
return m_txop->SetAmpduExist (ampdu); |
169 |
return m_txop->SetAmpduExist (ampdu); |
| 170 |
} |
170 |
} |
| 171 |
virtual void CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp) |
171 |
virtual void CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp, uint32_t nRetries) |
| 172 |
{ |
172 |
{ |
| 173 |
m_txop->CompleteMpduTx (packet, hdr, tstamp); |
173 |
m_txop->CompleteMpduTx (packet, hdr, tstamp, nRetries); |
| 174 |
} |
174 |
} |
| 175 |
virtual uint16_t GetNextSequenceNumberfor (WifiMacHeader *hdr) |
175 |
virtual uint16_t GetNextSequenceNumberfor (WifiMacHeader *hdr) |
| 176 |
{ |
176 |
{ |
|
|
| 180 |
{ |
180 |
{ |
| 181 |
return m_txop->PeekNextSequenceNumberfor (hdr); |
181 |
return m_txop->PeekNextSequenceNumberfor (hdr); |
| 182 |
} |
182 |
} |
| 183 |
virtual Ptr<const Packet> PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp) |
183 |
virtual Ptr<const Packet> PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp, uint32_t *nRetries) |
| 184 |
{ |
184 |
{ |
| 185 |
return m_txop->PeekNextRetransmitPacket (header, recipient, tid, timestamp); |
185 |
return m_txop->PeekNextRetransmitPacket (header, recipient, tid, timestamp, nRetries); |
| 186 |
} |
186 |
} |
| 187 |
virtual void RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber) |
187 |
virtual void RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber) |
| 188 |
{ |
188 |
{ |
|
|
| 450 |
} |
450 |
} |
| 451 |
|
451 |
|
| 452 |
Ptr<const Packet> |
452 |
Ptr<const Packet> |
| 453 |
EdcaTxopN::PeekNextRetransmitPacket (WifiMacHeader &header,Mac48Address recipient, uint8_t tid, Time *timestamp) |
453 |
EdcaTxopN::PeekNextRetransmitPacket (WifiMacHeader &header,Mac48Address recipient, uint8_t tid, Time *timestamp, uint32_t *nRetries) |
| 454 |
{ |
454 |
{ |
| 455 |
return m_baManager->PeekNextPacket (header,recipient,tid, timestamp); |
455 |
return m_baManager->PeekNextPacket (header,recipient,tid, timestamp, nRetries); |
| 456 |
} |
456 |
} |
| 457 |
|
457 |
|
| 458 |
void |
458 |
void |
|
|
| 1227 |
{ |
1227 |
{ |
| 1228 |
m_txOkCallback (m_currentHdr); |
1228 |
m_txOkCallback (m_currentHdr); |
| 1229 |
} |
1229 |
} |
| 1230 |
m_currentPacket = 0; |
1230 |
if (NeedBarRetransmission ()) |
| 1231 |
m_dcf->ResetCw (); |
1231 |
{ |
|
|
1232 |
if (!GetAmpduExist ()) |
| 1233 |
{ |
| 1234 |
//should i report this to station addressed by ADDR1? |
| 1235 |
NS_LOG_DEBUG ("Retransmit block ack request"); |
| 1236 |
m_currentHdr.SetRetry (); |
| 1237 |
} |
| 1238 |
else |
| 1239 |
{ |
| 1240 |
//standard says when loosing a BlockAck originator may send a BAR page 139 |
| 1241 |
NS_LOG_DEBUG ("Transmit Block Ack Request"); |
| 1242 |
CtrlBAckRequestHeader reqHdr; |
| 1243 |
reqHdr.SetType (COMPRESSED_BLOCK_ACK); |
| 1244 |
uint8_t tid = 0; |
| 1245 |
if (m_currentHdr.IsQosData ()) |
| 1246 |
{ |
| 1247 |
tid = m_currentHdr.GetQosTid (); |
| 1248 |
reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ()); |
| 1249 |
} |
| 1250 |
else if (m_currentHdr.IsBlockAckReq ()) |
| 1251 |
{ |
| 1252 |
CtrlBAckRequestHeader baReqHdr; |
| 1253 |
m_currentPacket->PeekHeader (baReqHdr); |
| 1254 |
tid = baReqHdr.GetTidInfo (); |
| 1255 |
reqHdr.SetStartingSequence (baReqHdr.GetStartingSequence ()); |
| 1256 |
} |
| 1257 |
else if (m_currentHdr.IsBlockAck ()) |
| 1258 |
{ |
| 1259 |
CtrlBAckResponseHeader baRespHdr; |
| 1260 |
m_currentPacket->PeekHeader (baRespHdr); |
| 1261 |
tid = baRespHdr.GetTidInfo (); |
| 1262 |
reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ()); |
| 1263 |
} |
| 1264 |
reqHdr.SetTidInfo (tid); |
| 1265 |
reqHdr.SetHtImmediateAck (true); |
| 1266 |
Ptr<Packet> bar = Create<Packet> (); |
| 1267 |
bar->AddHeader (reqHdr); |
| 1268 |
Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ()); |
| 1269 |
m_currentBar = request; |
| 1270 |
WifiMacHeader hdr; |
| 1271 |
hdr.SetType (WIFI_MAC_CTL_BACKREQ); |
| 1272 |
hdr.SetAddr1 (request.recipient); |
| 1273 |
hdr.SetAddr2 (m_low->GetAddress ()); |
| 1274 |
hdr.SetAddr3 (m_low->GetBssid ()); |
| 1275 |
hdr.SetDsNotTo (); |
| 1276 |
hdr.SetDsNotFrom (); |
| 1277 |
hdr.SetNoRetry (); |
| 1278 |
hdr.SetNoMoreFragments (); |
| 1279 |
|
| 1280 |
m_currentPacket = request.bar; |
| 1281 |
m_currentHdr = hdr; |
| 1282 |
} |
| 1283 |
m_dcf->UpdateFailedCw (); |
| 1284 |
} |
| 1285 |
else |
| 1286 |
{ |
| 1287 |
//to reset the dcf. |
| 1288 |
m_currentPacket = 0; |
| 1289 |
m_dcf->ResetCw (); |
| 1290 |
} |
| 1232 |
m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
1291 |
m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ())); |
| 1233 |
RestartAccessIfNeeded (); |
1292 |
RestartAccessIfNeeded (); |
| 1234 |
} |
1293 |
} |
|
|
| 1268 |
{ |
1327 |
{ |
| 1269 |
if (!m_currentHdr.IsRetry ()) |
1328 |
if (!m_currentHdr.IsRetry ()) |
| 1270 |
{ |
1329 |
{ |
| 1271 |
m_baManager->StorePacket (m_currentPacket, m_currentHdr, m_currentPacketTimestamp); |
1330 |
m_baManager->StorePacket (m_currentPacket, m_currentHdr, m_currentPacketTimestamp, 0); |
| 1272 |
} |
1331 |
} |
| 1273 |
m_baManager->NotifyMpduTransmission (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid (), |
1332 |
m_baManager->NotifyMpduTransmission (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid (), |
| 1274 |
m_txMiddle->GetNextSeqNumberByTidAndAddress (m_currentHdr.GetQosTid (), |
1333 |
m_txMiddle->GetNextSeqNumberByTidAndAddress (m_currentHdr.GetQosTid (), |
|
|
| 1277 |
} |
1336 |
} |
| 1278 |
|
1337 |
|
| 1279 |
void |
1338 |
void |
| 1280 |
EdcaTxopN::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp) |
1339 |
EdcaTxopN::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp, uint32_t nRetries) |
| 1281 |
{ |
1340 |
{ |
| 1282 |
NS_ASSERT (hdr.IsQosData ()); |
1341 |
NS_ASSERT (hdr.IsQosData ()); |
| 1283 |
m_baManager->StorePacket (packet, hdr, tstamp); |
1342 |
m_baManager->StorePacket (packet, hdr, tstamp, nRetries); |
| 1284 |
m_baManager->NotifyMpduTransmission (hdr.GetAddr1 (), hdr.GetQosTid (), |
1343 |
m_baManager->NotifyMpduTransmission (hdr.GetAddr1 (), hdr.GetQosTid (), |
| 1285 |
m_txMiddle->GetNextSeqNumberByTidAndAddress (hdr.GetQosTid (), |
1344 |
m_txMiddle->GetNextSeqNumberByTidAndAddress (hdr.GetQosTid (), |
| 1286 |
hdr.GetAddr1 ()), WifiMacHeader::NORMAL_ACK); |
1345 |
hdr.GetAddr1 ()), WifiMacHeader::NORMAL_ACK); |