View | Details | Raw Unified | Return to bug 2615
Collapse All | Expand All

(-)a/src/wifi/model/dca-txop.cc (+4 lines)
 Lines 131-136    Link Here 
131
  {
131
  {
132
    return false;
132
    return false;
133
  }
133
  }
134
  virtual Time GetTxopLimit (void)
135
  {
136
    return NanoSeconds (0);
137
  }
134
138
135
private:
139
private:
136
  DcaTxop *m_txop;
140
  DcaTxop *m_txop;
(-)a/src/wifi/model/edca-txop-n.cc (-53 / +210 lines)
 Lines 23-29    Link Here 
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"
 Lines 139-144    Link Here 
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 ();
 Lines 268-274    Link Here 
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);
 Lines 422-449    Link Here 
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
 Lines 501-506    Link Here 
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 ())
 Lines 547-562    Link Here 
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");
 Lines 569-579    Link Here 
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 ()))
 Lines 581-604    Link Here 
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 ()
 Lines 643-652    Link Here 
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 ();
 Lines 847-853    Link Here 
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 ();
 Lines 857-864    Link Here 
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.");
 Lines 904-909    Link Here 
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
 Lines 1096-1102    Link Here 
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 ())
 Lines 1185-1203    Link Here 
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
 Lines 1231-1248    Link Here 
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,
 Lines 1259-1265    Link Here 
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 ();
 Lines 1290-1296    Link Here 
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
    }
 Lines 1305-1312    Link Here 
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 ();
 Lines 1364-1404    Link Here 
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>
(-)a/src/wifi/model/edca-txop-n.h (+34 lines)
 Lines 25-30    Link Here 
25
#include "ns3/traced-value.h"
25
#include "ns3/traced-value.h"
26
#include "dcf.h"
26
#include "dcf.h"
27
#include "block-ack-manager.h"
27
#include "block-ack-manager.h"
28
#include "mac-low.h"
28
29
29
class AmpduAggregationTest;
30
class AmpduAggregationTest;
30
31
 Lines 328-333    Link Here 
328
   */
329
   */
329
  bool NeedFragmentation (void) const;
330
  bool NeedFragmentation (void) const;
330
  /**
331
  /**
332
   * Check if the current packet is fragmented because of an exceeded TXOP duration.
333
   *
334
   * \return true if the current packet is fragmented because of an exceeded TXOP duration,
335
   *         false otherwise
336
   */
337
  bool IsTxopFragmentation () const;
338
  /**
339
   * Calculate the size of the current TXOP fragment.
340
   *
341
   * \return the size of the current TXOP fragment
342
   */
343
  uint32_t GetTxopFragmentSize () const;
344
  /**
345
   * Calculate the number of TXOP fragments needed for the transmission of the current packet.
346
   *
347
   * \return the number of TXOP fragments needed for the transmission of the current packet
348
   */
349
  uint32_t GetNTxopFragment () const;
350
  /**
351
   * Calculate the size of the next TXOP fragment.
352
   *
353
   * \param fragmentNumber number of the next fragment
354
   */
355
  uint32_t GetNextTxopFragmentSize (uint32_t fragmentNumber) const;
356
  /**
357
   * Calculate the offset for the fragment.
358
   *
359
   * \param fragmentNumber number of the fragment
360
   */
361
  uint32_t GetTxopFragmentOffset (uint32_t fragmentNumber) const;
362
  /**
331
   * Calculate the size of the next fragment.
363
   * Calculate the size of the next fragment.
332
   *
364
   *
333
   * \return the size of the next fragment
365
   * \return the size of the next fragment
 Lines 562-567    Link Here 
562
  Ptr<const Packet> m_currentPacket;
594
  Ptr<const Packet> m_currentPacket;
563
595
564
  WifiMacHeader m_currentHdr;
596
  WifiMacHeader m_currentHdr;
597
  MacLowTransmissionParameters m_currentParams;
565
  Ptr<MsduAggregator> m_msduAggregator;
598
  Ptr<MsduAggregator> m_msduAggregator;
566
  Ptr<MpduAggregator> m_mpduAggregator;
599
  Ptr<MpduAggregator> m_mpduAggregator;
567
  TypeOfStation m_typeOfStation;
600
  TypeOfStation m_typeOfStation;
 Lines 577-582    Link Here 
577
  Bar m_currentBar;
610
  Bar m_currentBar;
578
  Time m_startTxop;
611
  Time m_startTxop;
579
  bool m_isAccessRequestedForRts;
612
  bool m_isAccessRequestedForRts;
613
  bool m_currentIsFragmented;
580
  TracedValue<uint32_t> m_backoffTrace;
614
  TracedValue<uint32_t> m_backoffTrace;
581
  TracedValue<uint32_t> m_cwTrace;
615
  TracedValue<uint32_t> m_cwTrace;
582
  TracedCallback<Time, Time> m_txopTrace;
616
  TracedCallback<Time, Time> m_txopTrace;
(-)a/src/wifi/model/mac-low.cc (-5 / +35 lines)
 Lines 985-994    Link Here 
985
      NS_LOG_DEBUG ("receive ack from=" << m_currentHdr.GetAddr1 ());
985
      NS_LOG_DEBUG ("receive ack from=" << m_currentHdr.GetAddr1 ());
986
      SnrTag tag;
986
      SnrTag tag;
987
      packet->RemovePacketTag (tag);
987
      packet->RemovePacketTag (tag);
988
      m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
988
      //When fragmentation is used, only update manager when the last fragment is acknowledged
989
                                    rxSnr, txVector.GetMode ());
989
      if (!m_txParams.HasNextPacket ())
990
      m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
990
        {
991
                                      rxSnr, txVector.GetMode (), tag.Get ());
991
          m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
992
                                        rxSnr, txVector.GetMode ());
993
          m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
994
                                          rxSnr, txVector.GetMode (), tag.Get ());
995
        }
992
      bool gotAck = false;
996
      bool gotAck = false;
993
      if (m_txParams.MustWaitNormalAck ()
997
      if (m_txParams.MustWaitNormalAck ()
994
          && m_normalAckTimeoutEvent.IsRunning ())
998
          && m_normalAckTimeoutEvent.IsRunning ())
 Lines 1008-1014    Link Here 
1008
        {
1012
        {
1009
          m_listener->GotAck (rxSnr, txVector.GetMode ());
1013
          m_listener->GotAck (rxSnr, txVector.GetMode ());
1010
        }
1014
        }
1011
      if (m_txParams.HasNextPacket ())
1015
      if (m_txParams.HasNextPacket () && (!m_currentHdr.IsQosData () || m_listener->GetTxopLimit () == NanoSeconds (0) || m_listener->HasTxop ()))
1012
        {
1016
        {
1013
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
1017
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
1014
                                                 &MacLow::WaitSifsAfterEndTxFragment, this);
1018
                                                 &MacLow::WaitSifsAfterEndTxFragment, this);
 Lines 1398-1403    Link Here 
1398
}
1402
}
1399
1403
1400
Time
1404
Time
1405
MacLow::CalculateOverallTxFragmentTime (Ptr<const Packet> packet,
1406
                                        const WifiMacHeader* hdr,
1407
                                        const MacLowTransmissionParameters& params,
1408
                                        uint32_t fragmentSize) const
1409
{
1410
  Time txTime = Seconds (0);
1411
  if (params.MustSendRts ())
1412
    {
1413
      WifiTxVector rtsTxVector = GetRtsTxVector (packet, hdr);
1414
      txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, m_phy->GetFrequency ());
1415
      txTime += GetCtsDuration (hdr->GetAddr1 (), rtsTxVector);
1416
      txTime += Time (GetSifs () * 2);
1417
    }
1418
  WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
1419
  Ptr<const Packet> fragment = Create<Packet> (fragmentSize);
1420
  uint32_t dataSize = GetSize (fragment, hdr);
1421
  txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, m_phy->GetFrequency ());
1422
  txTime += GetSifs ();
1423
  if (params.MustWaitAck ())
1424
    {
1425
      txTime += GetAckDuration (hdr->GetAddr1 (), dataTxVector);
1426
    }
1427
  return txTime;
1428
}
1429
1430
Time
1401
MacLow::CalculateTransmissionTime (Ptr<const Packet> packet,
1431
MacLow::CalculateTransmissionTime (Ptr<const Packet> packet,
1402
                                   const WifiMacHeader* hdr,
1432
                                   const WifiMacHeader* hdr,
1403
                                   const MacLowTransmissionParameters& params) const
1433
                                   const MacLowTransmissionParameters& params) const
(-)a/src/wifi/model/mac-low.h (+9 lines)
 Lines 133-138    Link Here 
133
   * Returns whether it has TXOP granted for the next MPDU
133
   * Returns whether it has TXOP granted for the next MPDU
134
   */
134
   */
135
  virtual bool HasTxop (void) = 0;
135
  virtual bool HasTxop (void) = 0;
136
  /**
137
   * Returns the TXOP limit duration
138
   */
139
  virtual Time GetTxopLimit (void) = 0;
136
};
140
};
137
141
138
142
 Lines 697-702    Link Here 
697
  Time CalculateOverallTxTime (Ptr<const Packet> packet,
701
  Time CalculateOverallTxTime (Ptr<const Packet> packet,
698
                               const WifiMacHeader* hdr,
702
                               const WifiMacHeader* hdr,
699
                               const MacLowTransmissionParameters &params) const;
703
                               const MacLowTransmissionParameters &params) const;
704
    
705
  Time CalculateOverallTxFragmentTime (Ptr<const Packet> packet,
706
                                       const WifiMacHeader* hdr,
707
                                       const MacLowTransmissionParameters& params,
708
                                       uint32_t fragmentSize) const;
700
709
701
  /**
710
  /**
702
   * \param packet packet to send
711
   * \param packet packet to send

Return to bug 2615