|
|
| 23 |
#include "ns3/log.h" |
23 |
#include "ns3/log.h" |
| 24 |
#include "ns3/pointer.h" |
24 |
#include "ns3/pointer.h" |
| 25 |
#include "edca-txop-n.h" |
25 |
#include "edca-txop-n.h" |
| 26 |
#include "mac-low.h" |
|
|
| 27 |
#include "dcf-manager.h" |
26 |
#include "dcf-manager.h" |
| 28 |
#include "mac-tx-middle.h" |
27 |
#include "mac-tx-middle.h" |
| 29 |
#include "wifi-mac-trailer.h" |
28 |
#include "wifi-mac-trailer.h" |
|
|
| 139 |
{ |
138 |
{ |
| 140 |
return m_txop->HasTxop (); |
139 |
return m_txop->HasTxop (); |
| 141 |
} |
140 |
} |
|
|
141 |
virtual Time GetTxopLimit (void) |
| 142 |
{ |
| 143 |
return m_txop->GetTxopLimit (); |
| 144 |
} |
| 142 |
virtual Ptr<WifiMacQueue> GetQueue (void) |
145 |
virtual Ptr<WifiMacQueue> GetQueue (void) |
| 143 |
{ |
146 |
{ |
| 144 |
return m_txop->GetEdcaQueue (); |
147 |
return m_txop->GetEdcaQueue (); |
|
|
| 268 |
m_typeOfStation (STA), |
271 |
m_typeOfStation (STA), |
| 269 |
m_blockAckType (COMPRESSED_BLOCK_ACK), |
272 |
m_blockAckType (COMPRESSED_BLOCK_ACK), |
| 270 |
m_startTxop (Seconds (0)), |
273 |
m_startTxop (Seconds (0)), |
| 271 |
m_isAccessRequestedForRts (false) |
274 |
m_isAccessRequestedForRts (false), |
|
|
275 |
m_currentIsFragmented (false) |
| 272 |
{ |
276 |
{ |
| 273 |
NS_LOG_FUNCTION (this); |
277 |
NS_LOG_FUNCTION (this); |
| 274 |
m_transmissionListener = new EdcaTxopN::TransmissionListener (this); |
278 |
m_transmissionListener = new EdcaTxopN::TransmissionListener (this); |
|
|
| 422 |
uint32_t |
426 |
uint32_t |
| 423 |
EdcaTxopN::GetMinCw (void) const |
427 |
EdcaTxopN::GetMinCw (void) const |
| 424 |
{ |
428 |
{ |
| 425 |
NS_LOG_FUNCTION (this); |
|
|
| 426 |
return m_dcf->GetCwMin (); |
429 |
return m_dcf->GetCwMin (); |
| 427 |
} |
430 |
} |
| 428 |
|
431 |
|
| 429 |
uint32_t |
432 |
uint32_t |
| 430 |
EdcaTxopN::GetMaxCw (void) const |
433 |
EdcaTxopN::GetMaxCw (void) const |
| 431 |
{ |
434 |
{ |
| 432 |
NS_LOG_FUNCTION (this); |
|
|
| 433 |
return m_dcf->GetCwMax (); |
435 |
return m_dcf->GetCwMax (); |
| 434 |
} |
436 |
} |
| 435 |
|
437 |
|
| 436 |
uint32_t |
438 |
uint32_t |
| 437 |
EdcaTxopN::GetAifsn (void) const |
439 |
EdcaTxopN::GetAifsn (void) const |
| 438 |
{ |
440 |
{ |
| 439 |
NS_LOG_FUNCTION (this); |
|
|
| 440 |
return m_dcf->GetAifsn (); |
441 |
return m_dcf->GetAifsn (); |
| 441 |
} |
442 |
} |
| 442 |
|
443 |
|
| 443 |
Time |
444 |
Time |
| 444 |
EdcaTxopN::GetTxopLimit (void) const |
445 |
EdcaTxopN::GetTxopLimit (void) const |
| 445 |
{ |
446 |
{ |
| 446 |
NS_LOG_FUNCTION (this); |
|
|
| 447 |
return m_dcf->GetTxopLimit (); |
447 |
return m_dcf->GetTxopLimit (); |
| 448 |
} |
448 |
} |
| 449 |
|
449 |
|
|
|
| 501 |
{ |
501 |
{ |
| 502 |
NS_LOG_FUNCTION (this); |
502 |
NS_LOG_FUNCTION (this); |
| 503 |
m_isAccessRequestedForRts = false; |
503 |
m_isAccessRequestedForRts = false; |
|
|
504 |
m_startTxop = Simulator::Now (); |
| 504 |
if (m_currentPacket == 0) |
505 |
if (m_currentPacket == 0) |
| 505 |
{ |
506 |
{ |
| 506 |
if (m_queue->IsEmpty () && !m_baManager->HasPackets ()) |
507 |
if (m_queue->IsEmpty () && !m_baManager->HasPackets ()) |
|
|
| 547 |
} |
548 |
} |
| 548 |
} |
549 |
} |
| 549 |
} |
550 |
} |
| 550 |
MacLowTransmissionParameters params; |
551 |
m_currentParams.DisableOverrideDurationId (); |
| 551 |
params.DisableOverrideDurationId (); |
|
|
| 552 |
if (m_currentHdr.GetAddr1 ().IsGroup ()) |
552 |
if (m_currentHdr.GetAddr1 ().IsGroup ()) |
| 553 |
{ |
553 |
{ |
| 554 |
params.DisableRts (); |
554 |
m_currentParams.DisableRts (); |
| 555 |
params.DisableAck (); |
555 |
m_currentParams.DisableAck (); |
| 556 |
params.DisableNextData (); |
556 |
m_currentParams.DisableNextData (); |
| 557 |
m_low->StartTransmission (m_currentPacket, |
557 |
m_low->StartTransmission (m_currentPacket, |
| 558 |
&m_currentHdr, |
558 |
&m_currentHdr, |
| 559 |
params, |
559 |
m_currentParams, |
| 560 |
m_transmissionListener); |
560 |
m_transmissionListener); |
| 561 |
|
561 |
|
| 562 |
NS_LOG_DEBUG ("tx broadcast"); |
562 |
NS_LOG_DEBUG ("tx broadcast"); |
|
|
| 569 |
{ |
569 |
{ |
| 570 |
if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
570 |
if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
| 571 |
{ |
571 |
{ |
| 572 |
params.DisableAck (); |
572 |
m_currentParams.DisableAck (); |
| 573 |
} |
573 |
} |
| 574 |
else |
574 |
else |
| 575 |
{ |
575 |
{ |
| 576 |
params.EnableAck (); |
576 |
m_currentParams.EnableAck (); |
| 577 |
} |
577 |
} |
| 578 |
if (((m_currentHdr.IsQosData () && !m_currentHdr.IsQosAmsdu ()) |
578 |
if (((m_currentHdr.IsQosData () && !m_currentHdr.IsQosAmsdu ()) |
| 579 |
|| (m_currentHdr.IsData () && !m_currentHdr.IsQosData ())) |
579 |
|| (m_currentHdr.IsData () && !m_currentHdr.IsQosData ())) |
|
|
| 581 |
&& NeedFragmentation ()) |
581 |
&& NeedFragmentation ()) |
| 582 |
{ |
582 |
{ |
| 583 |
//With COMPRESSED_BLOCK_ACK fragmentation must be avoided. |
583 |
//With COMPRESSED_BLOCK_ACK fragmentation must be avoided. |
| 584 |
params.DisableRts (); |
584 |
m_currentIsFragmented = true; |
|
|
585 |
m_currentParams.DisableRts (); |
| 585 |
WifiMacHeader hdr; |
586 |
WifiMacHeader hdr; |
| 586 |
Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
587 |
Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
| 587 |
if (IsLastFragment ()) |
588 |
if (IsLastFragment ()) |
| 588 |
{ |
589 |
{ |
| 589 |
NS_LOG_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ()); |
590 |
NS_LOG_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ()); |
| 590 |
params.DisableNextData (); |
591 |
m_currentParams.DisableNextData (); |
| 591 |
} |
592 |
} |
| 592 |
else |
593 |
else |
| 593 |
{ |
594 |
{ |
| 594 |
NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ()); |
595 |
NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ()); |
| 595 |
params.EnableNextData (GetNextFragmentSize ()); |
596 |
m_currentParams.EnableNextData (GetNextFragmentSize ()); |
| 596 |
} |
597 |
} |
| 597 |
m_low->StartTransmission (fragment, &hdr, params, |
598 |
m_low->StartTransmission (fragment, &hdr, m_currentParams, |
| 598 |
m_transmissionListener); |
599 |
m_transmissionListener); |
| 599 |
} |
600 |
} |
| 600 |
else |
601 |
else |
| 601 |
{ |
602 |
{ |
|
|
603 |
m_currentIsFragmented = false; |
| 602 |
WifiMacHeader peekedHdr; |
604 |
WifiMacHeader peekedHdr; |
| 603 |
Time tstamp; |
605 |
Time tstamp; |
| 604 |
if (m_currentHdr.IsQosData () |
606 |
if (m_currentHdr.IsQosData () |
|
|
| 643 |
NS_LOG_DEBUG ("tx unicast A-MSDU"); |
645 |
NS_LOG_DEBUG ("tx unicast A-MSDU"); |
| 644 |
} |
646 |
} |
| 645 |
} |
647 |
} |
| 646 |
params.DisableNextData (); |
648 |
m_currentParams.DisableNextData (); |
| 647 |
m_startTxop = Simulator::Now (); |
|
|
| 648 |
m_low->StartTransmission (m_currentPacket, &m_currentHdr, |
649 |
m_low->StartTransmission (m_currentPacket, &m_currentHdr, |
| 649 |
params, m_transmissionListener); |
650 |
m_currentParams, m_transmissionListener); |
| 650 |
if (!GetAmpduExist (m_currentHdr.GetAddr1 ())) |
651 |
if (!GetAmpduExist (m_currentHdr.GetAddr1 ())) |
| 651 |
{ |
652 |
{ |
| 652 |
CompleteTx (); |
653 |
CompleteTx (); |
|
|
| 847 |
void |
848 |
void |
| 848 |
EdcaTxopN::Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr) |
849 |
EdcaTxopN::Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr) |
| 849 |
{ |
850 |
{ |
| 850 |
NS_LOG_FUNCTION (this << packet << &hdr); |
851 |
//NS_LOG_FUNCTION (this << packet << &hdr); |
| 851 |
m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr, packet); |
852 |
m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr, packet); |
| 852 |
m_queue->Enqueue (packet, hdr); |
853 |
m_queue->Enqueue (packet, hdr); |
| 853 |
StartAccessIfNeeded (); |
854 |
StartAccessIfNeeded (); |
|
|
| 857 |
EdcaTxopN::GotAck (double snr, WifiMode txMode) |
858 |
EdcaTxopN::GotAck (double snr, WifiMode txMode) |
| 858 |
{ |
859 |
{ |
| 859 |
NS_LOG_FUNCTION (this << snr << txMode); |
860 |
NS_LOG_FUNCTION (this << snr << txMode); |
| 860 |
if (!NeedFragmentation () |
861 |
if (!m_currentIsFragmented |
| 861 |
|| IsLastFragment () |
862 |
|| !m_currentParams.HasNextPacket () |
| 862 |
|| m_currentHdr.IsQosAmsdu ()) |
863 |
|| m_currentHdr.IsQosAmsdu ()) |
| 863 |
{ |
864 |
{ |
| 864 |
NS_LOG_DEBUG ("got ack. tx done."); |
865 |
NS_LOG_DEBUG ("got ack. tx done."); |
|
|
| 904 |
else |
905 |
else |
| 905 |
{ |
906 |
{ |
| 906 |
NS_LOG_DEBUG ("got ack. tx not done, size=" << m_currentPacket->GetSize ()); |
907 |
NS_LOG_DEBUG ("got ack. tx not done, size=" << m_currentPacket->GetSize ()); |
|
|
908 |
if (!HasTxop ()) |
| 909 |
{ |
| 910 |
if (m_currentHdr.IsQosData () && GetTxopLimit () > NanoSeconds (0)) |
| 911 |
{ |
| 912 |
m_txopTrace (m_startTxop, Simulator::Now () - m_startTxop); |
| 913 |
m_cwTrace = m_dcf->GetCw (); |
| 914 |
m_backoffTrace = m_rng->GetNext (0, m_dcf->GetCw ()); |
| 915 |
m_dcf->StartBackoffNow (m_backoffTrace); |
| 916 |
m_fragmentNumber++; |
| 917 |
RestartAccessIfNeeded (); |
| 918 |
} |
| 919 |
} |
| 907 |
} |
920 |
} |
| 908 |
} |
921 |
} |
| 909 |
|
922 |
|
|
|
| 1096 |
void |
1109 |
void |
| 1097 |
EdcaTxopN::StartAccessIfNeeded (void) |
1110 |
EdcaTxopN::StartAccessIfNeeded (void) |
| 1098 |
{ |
1111 |
{ |
| 1099 |
NS_LOG_FUNCTION (this); |
1112 |
//NS_LOG_FUNCTION (this); |
| 1100 |
if (m_currentPacket == 0 |
1113 |
if (m_currentPacket == 0 |
| 1101 |
&& (!m_queue->IsEmpty () || m_baManager->HasPackets ()) |
1114 |
&& (!m_queue->IsEmpty () || m_baManager->HasPackets ()) |
| 1102 |
&& !m_dcf->IsAccessRequested ()) |
1115 |
&& !m_dcf->IsAccessRequested ()) |
|
|
| 1185 |
NextFragment (); |
1198 |
NextFragment (); |
| 1186 |
WifiMacHeader hdr; |
1199 |
WifiMacHeader hdr; |
| 1187 |
Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
1200 |
Ptr<Packet> fragment = GetFragmentPacket (&hdr); |
| 1188 |
MacLowTransmissionParameters params; |
1201 |
m_currentParams.EnableAck (); |
| 1189 |
params.EnableAck (); |
1202 |
m_currentParams.DisableRts (); |
| 1190 |
params.DisableRts (); |
1203 |
m_currentParams.DisableOverrideDurationId (); |
| 1191 |
params.DisableOverrideDurationId (); |
|
|
| 1192 |
if (IsLastFragment ()) |
1204 |
if (IsLastFragment ()) |
| 1193 |
{ |
1205 |
{ |
| 1194 |
params.DisableNextData (); |
1206 |
m_currentParams.DisableNextData (); |
| 1195 |
} |
1207 |
} |
| 1196 |
else |
1208 |
else |
| 1197 |
{ |
1209 |
{ |
| 1198 |
params.EnableNextData (GetNextFragmentSize ()); |
1210 |
m_currentParams.EnableNextData (GetNextFragmentSize ()); |
| 1199 |
} |
1211 |
} |
| 1200 |
GetLow ()->StartTransmission (fragment, &hdr, params, m_transmissionListener); |
1212 |
GetLow ()->StartTransmission (fragment, &hdr, m_currentParams, m_transmissionListener); |
| 1201 |
} |
1213 |
} |
| 1202 |
|
1214 |
|
| 1203 |
void |
1215 |
void |
|
|
| 1231 |
} |
1243 |
} |
| 1232 |
return; |
1244 |
return; |
| 1233 |
} |
1245 |
} |
| 1234 |
MacLowTransmissionParameters params; |
1246 |
m_currentParams.DisableOverrideDurationId (); |
| 1235 |
params.DisableOverrideDurationId (); |
1247 |
m_currentParams.DisableNextData (); |
| 1236 |
params.DisableNextData (); |
|
|
| 1237 |
if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
1248 |
if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
| 1238 |
{ |
1249 |
{ |
| 1239 |
params.DisableAck (); |
1250 |
m_currentParams.DisableAck (); |
| 1240 |
} |
1251 |
} |
| 1241 |
else |
1252 |
else |
| 1242 |
{ |
1253 |
{ |
| 1243 |
params.EnableAck (); |
1254 |
m_currentParams.EnableAck (); |
| 1244 |
} |
1255 |
} |
| 1245 |
if (txopLimit >= GetLow ()->CalculateOverallTxTime (peekedPacket, &hdr, params)) |
1256 |
if (txopLimit >= GetLow ()->CalculateOverallTxTime (peekedPacket, &hdr, m_currentParams)) |
| 1246 |
{ |
1257 |
{ |
| 1247 |
NS_LOG_DEBUG ("start next packet"); |
1258 |
NS_LOG_DEBUG ("start next packet"); |
| 1248 |
m_currentPacket = m_queue->DequeueByTidAndAddress (&hdr, |
1259 |
m_currentPacket = m_queue->DequeueByTidAndAddress (&hdr, |
|
|
| 1259 |
m_currentHdr.SetNoRetry (); |
1270 |
m_currentHdr.SetNoRetry (); |
| 1260 |
m_fragmentNumber = 0; |
1271 |
m_fragmentNumber = 0; |
| 1261 |
VerifyBlockAck (); |
1272 |
VerifyBlockAck (); |
| 1262 |
GetLow ()->StartTransmission (m_currentPacket, &m_currentHdr, params, m_transmissionListener); |
1273 |
GetLow ()->StartTransmission (m_currentPacket, &m_currentHdr, m_currentParams, m_transmissionListener); |
| 1263 |
if (!GetAmpduExist (m_currentHdr.GetAddr1 ())) |
1274 |
if (!GetAmpduExist (m_currentHdr.GetAddr1 ())) |
| 1264 |
{ |
1275 |
{ |
| 1265 |
CompleteTx (); |
1276 |
CompleteTx (); |
|
|
| 1290 |
NS_LOG_FUNCTION (this); |
1301 |
NS_LOG_FUNCTION (this); |
| 1291 |
WifiMacHeader hdr; |
1302 |
WifiMacHeader hdr; |
| 1292 |
Time tstamp; |
1303 |
Time tstamp; |
| 1293 |
if (!m_currentHdr.IsQosData ()) |
1304 |
if (!m_currentHdr.IsQosData () || GetTxopLimit () == NanoSeconds (0)) |
| 1294 |
{ |
1305 |
{ |
| 1295 |
return false; |
1306 |
return false; |
| 1296 |
} |
1307 |
} |
|
|
| 1305 |
return false; |
1316 |
return false; |
| 1306 |
} |
1317 |
} |
| 1307 |
|
1318 |
|
| 1308 |
MacLowTransmissionParameters params; |
1319 |
MacLowTransmissionParameters params = m_currentParams; |
| 1309 |
params.DisableOverrideDurationId (); |
|
|
| 1310 |
if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
1320 |
if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ()) |
| 1311 |
{ |
1321 |
{ |
| 1312 |
params.DisableAck (); |
1322 |
params.DisableAck (); |
|
|
| 1364 |
//HT-delayed Block Ack agreement or when it is carried in an A-MPDU. |
1374 |
//HT-delayed Block Ack agreement or when it is carried in an A-MPDU. |
| 1365 |
return false; |
1375 |
return false; |
| 1366 |
} |
1376 |
} |
| 1367 |
return m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr, |
1377 |
bool needTxopFragmentation = false; |
| 1368 |
m_currentPacket); |
1378 |
if (GetTxopLimit () > NanoSeconds (0) && m_currentHdr.IsData ()) |
|
|
1379 |
{ |
| 1380 |
needTxopFragmentation = (GetLow ()->CalculateOverallTxTime (m_currentPacket, &m_currentHdr, m_currentParams) > GetTxopLimit ()); |
| 1381 |
} |
| 1382 |
return (needTxopFragmentation || m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr, m_currentPacket)); |
| 1383 |
} |
| 1384 |
|
| 1385 |
bool |
| 1386 |
EdcaTxopN::IsTxopFragmentation () const |
| 1387 |
{ |
| 1388 |
NS_LOG_FUNCTION (this); |
| 1389 |
if (GetTxopLimit () == NanoSeconds (0)) |
| 1390 |
{ |
| 1391 |
return false; |
| 1392 |
} |
| 1393 |
if (!m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr, m_currentPacket) |
| 1394 |
|| (GetTxopFragmentSize () < m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,m_currentPacket, 0))) |
| 1395 |
{ |
| 1396 |
return true; |
| 1397 |
} |
| 1398 |
return false; |
| 1399 |
} |
| 1400 |
|
| 1401 |
uint32_t |
| 1402 |
EdcaTxopN::GetTxopFragmentSize () const |
| 1403 |
{ |
| 1404 |
NS_LOG_FUNCTION (this); |
| 1405 |
Time txopDuration = GetTxopLimit (); |
| 1406 |
if (txopDuration == NanoSeconds (0)) |
| 1407 |
{ |
| 1408 |
return 0; |
| 1409 |
} |
| 1410 |
uint32_t maxSize = m_currentPacket->GetSize (); |
| 1411 |
uint32_t minSize = 0; |
| 1412 |
uint32_t size; |
| 1413 |
bool found = false; |
| 1414 |
while (!found) |
| 1415 |
{ |
| 1416 |
size = (minSize + ((maxSize - minSize) / 2)); |
| 1417 |
if (GetLow ()->CalculateOverallTxFragmentTime (m_currentPacket, &m_currentHdr, m_currentParams, size) > txopDuration) |
| 1418 |
{ |
| 1419 |
maxSize = size; |
| 1420 |
} |
| 1421 |
else |
| 1422 |
{ |
| 1423 |
minSize = size; |
| 1424 |
} |
| 1425 |
if (GetLow ()->CalculateOverallTxFragmentTime (m_currentPacket, &m_currentHdr, m_currentParams, size) <= txopDuration |
| 1426 |
&& GetLow ()->CalculateOverallTxFragmentTime (m_currentPacket, &m_currentHdr, m_currentParams, size + 1) > txopDuration) |
| 1427 |
{ |
| 1428 |
found = true; |
| 1429 |
} |
| 1430 |
} |
| 1431 |
NS_ASSERT (size != 0); |
| 1432 |
return size; |
| 1433 |
} |
| 1434 |
|
| 1435 |
uint32_t |
| 1436 |
EdcaTxopN::GetNTxopFragment () const |
| 1437 |
{ |
| 1438 |
NS_LOG_FUNCTION (this); |
| 1439 |
uint32_t fragmentSize = GetTxopFragmentSize (); |
| 1440 |
uint32_t nFragments = (m_currentPacket->GetSize () / fragmentSize); |
| 1441 |
if ((m_currentPacket->GetSize () % fragmentSize) > 0) |
| 1442 |
{ |
| 1443 |
nFragments++; |
| 1444 |
} |
| 1445 |
NS_LOG_DEBUG ("GetNTxopFragment returning " << nFragments); |
| 1446 |
return nFragments; |
| 1447 |
} |
| 1448 |
|
| 1449 |
uint32_t |
| 1450 |
EdcaTxopN::GetTxopFragmentOffset (uint32_t fragmentNumber) const |
| 1451 |
{ |
| 1452 |
NS_LOG_FUNCTION (this << fragmentNumber); |
| 1453 |
if (fragmentNumber == 0) |
| 1454 |
{ |
| 1455 |
return 0; |
| 1456 |
} |
| 1457 |
uint32_t offset; |
| 1458 |
uint32_t fragmentSize = GetTxopFragmentSize (); |
| 1459 |
uint32_t nFragments = (m_currentPacket->GetSize () / fragmentSize); |
| 1460 |
if ((m_currentPacket->GetSize () % fragmentSize) > 0) |
| 1461 |
{ |
| 1462 |
nFragments++; |
| 1463 |
} |
| 1464 |
if (fragmentNumber < nFragments) |
| 1465 |
{ |
| 1466 |
offset = (fragmentNumber * fragmentSize); |
| 1467 |
} |
| 1468 |
else |
| 1469 |
{ |
| 1470 |
NS_ASSERT (false); |
| 1471 |
} |
| 1472 |
NS_LOG_DEBUG ("GetTxopFragmentOffset returning " << offset); |
| 1473 |
return offset; |
| 1474 |
} |
| 1475 |
|
| 1476 |
uint32_t |
| 1477 |
EdcaTxopN::GetNextTxopFragmentSize (uint32_t fragmentNumber) const |
| 1478 |
{ |
| 1479 |
NS_LOG_FUNCTION (this << fragmentNumber); |
| 1480 |
uint32_t fragmentSize = GetTxopFragmentSize (); |
| 1481 |
uint32_t nFragments = GetNTxopFragment (); |
| 1482 |
if (fragmentNumber >= nFragments) |
| 1483 |
{ |
| 1484 |
NS_LOG_DEBUG ("GetNextTxopFragmentSize returning 0"); |
| 1485 |
return 0; |
| 1486 |
} |
| 1487 |
if (fragmentNumber == nFragments - 1) |
| 1488 |
{ |
| 1489 |
fragmentSize = (m_currentPacket->GetSize () - ((nFragments - 1) * fragmentSize)); |
| 1490 |
} |
| 1491 |
NS_LOG_DEBUG ("GetNextTxopFragmentSize returning " << fragmentSize); |
| 1492 |
return fragmentSize; |
| 1369 |
} |
1493 |
} |
| 1370 |
|
1494 |
|
| 1371 |
uint32_t |
1495 |
uint32_t |
| 1372 |
EdcaTxopN::GetFragmentSize (void) const |
1496 |
EdcaTxopN::GetFragmentSize (void) const |
| 1373 |
{ |
1497 |
{ |
| 1374 |
NS_LOG_FUNCTION (this); |
1498 |
NS_LOG_FUNCTION (this); |
| 1375 |
return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr, |
1499 |
uint32_t size; |
| 1376 |
m_currentPacket, m_fragmentNumber); |
1500 |
if (IsTxopFragmentation ()) |
|
|
1501 |
{ |
| 1502 |
size = GetNextTxopFragmentSize (m_fragmentNumber); |
| 1503 |
} |
| 1504 |
else |
| 1505 |
{ |
| 1506 |
size = m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,m_currentPacket, m_fragmentNumber); |
| 1507 |
} |
| 1508 |
return size; |
| 1377 |
} |
1509 |
} |
| 1378 |
|
1510 |
|
| 1379 |
uint32_t |
1511 |
uint32_t |
| 1380 |
EdcaTxopN::GetNextFragmentSize (void) const |
1512 |
EdcaTxopN::GetNextFragmentSize (void) const |
| 1381 |
{ |
1513 |
{ |
| 1382 |
NS_LOG_FUNCTION (this); |
1514 |
NS_LOG_FUNCTION (this); |
| 1383 |
return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr, |
1515 |
uint32_t size; |
| 1384 |
m_currentPacket, m_fragmentNumber + 1); |
1516 |
if (IsTxopFragmentation ()) |
|
|
1517 |
{ |
| 1518 |
size = GetNextTxopFragmentSize (m_fragmentNumber + 1); |
| 1519 |
} |
| 1520 |
else |
| 1521 |
{ |
| 1522 |
size = m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,m_currentPacket, m_fragmentNumber + 1); |
| 1523 |
} |
| 1524 |
return size; |
| 1385 |
} |
1525 |
} |
| 1386 |
|
1526 |
|
| 1387 |
uint32_t |
1527 |
uint32_t |
| 1388 |
EdcaTxopN::GetFragmentOffset (void) const |
1528 |
EdcaTxopN::GetFragmentOffset (void) const |
| 1389 |
{ |
1529 |
{ |
| 1390 |
NS_LOG_FUNCTION (this); |
1530 |
NS_LOG_FUNCTION (this); |
| 1391 |
return m_stationManager->GetFragmentOffset (m_currentHdr.GetAddr1 (), &m_currentHdr, |
1531 |
uint32_t offset; |
| 1392 |
m_currentPacket, m_fragmentNumber); |
1532 |
if (IsTxopFragmentation ()) |
|
|
1533 |
{ |
| 1534 |
offset = GetTxopFragmentOffset (m_fragmentNumber); |
| 1535 |
} |
| 1536 |
else |
| 1537 |
{ |
| 1538 |
offset = m_stationManager->GetFragmentOffset (m_currentHdr.GetAddr1 (), &m_currentHdr, |
| 1539 |
m_currentPacket, m_fragmentNumber); |
| 1540 |
} |
| 1541 |
return offset; |
| 1393 |
} |
1542 |
} |
| 1394 |
|
1543 |
|
| 1395 |
|
|
|
| 1396 |
bool |
1544 |
bool |
| 1397 |
EdcaTxopN::IsLastFragment (void) const |
1545 |
EdcaTxopN::IsLastFragment (void) const |
| 1398 |
{ |
1546 |
{ |
| 1399 |
NS_LOG_FUNCTION (this); |
1547 |
NS_LOG_FUNCTION (this); |
| 1400 |
return m_stationManager->IsLastFragment (m_currentHdr.GetAddr1 (), &m_currentHdr, |
1548 |
bool isLastFragment; |
| 1401 |
m_currentPacket, m_fragmentNumber); |
1549 |
if (IsTxopFragmentation ()) |
|
|
1550 |
{ |
| 1551 |
isLastFragment = (m_fragmentNumber == GetNTxopFragment () - 1); |
| 1552 |
} |
| 1553 |
else |
| 1554 |
{ |
| 1555 |
isLastFragment = m_stationManager->IsLastFragment (m_currentHdr.GetAddr1 (), &m_currentHdr, |
| 1556 |
m_currentPacket, m_fragmentNumber); |
| 1557 |
} |
| 1558 |
return isLastFragment; |
| 1402 |
} |
1559 |
} |
| 1403 |
|
1560 |
|
| 1404 |
Ptr<Packet> |
1561 |
Ptr<Packet> |