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

(-)a/src/wifi/model/dca-txop.cc (-1 / +1 lines)
 Lines 116-122    Link Here 
116
  {
116
  {
117
    m_txop->StartNextFragment ();
117
    m_txop->StartNextFragment ();
118
  }
118
  }
119
  virtual void StartNext (void)
119
  virtual void StartNextPacket (void)
120
  {
120
  {
121
  }
121
  }
122
  virtual void Cancel (void)
122
  virtual void Cancel (void)
(-)a/src/wifi/model/edca-txop-n.cc (-34 / +53 lines)
 Lines 123-131    Link Here 
123
  {
123
  {
124
    m_txop->StartNextFragment ();
124
    m_txop->StartNextFragment ();
125
  }
125
  }
126
  virtual void StartNext (void)
126
  virtual void StartNextPacket (void)
127
  {
127
  {
128
    m_txop->StartNext ();
128
    m_txop->StartNextPacket ();
129
  }
129
  }
130
  virtual void Cancel (void)
130
  virtual void Cancel (void)
131
  {
131
  {
 Lines 1201-1220    Link Here 
1201
}
1201
}
1202
1202
1203
void
1203
void
1204
EdcaTxopN::StartNext (void)
1204
EdcaTxopN::StartNextPacket (void)
1205
{
1205
{
1206
  NS_LOG_FUNCTION (this);
1206
  NS_LOG_FUNCTION (this);
1207
  Time txopLimit = GetTxopLimit ();
1207
  Time txopLimit = GetTxopLimit ();
1208
  NS_ASSERT (txopLimit == NanoSeconds (0) || Simulator::Now () - m_startTxop <= txopLimit);
1208
  NS_ASSERT (txopLimit == NanoSeconds (0) || Simulator::Now () - m_startTxop <= txopLimit);
1209
  WifiMacHeader hdr;
1209
  WifiMacHeader hdr = m_currentHdr;
1210
  Time tstamp;
1210
  Time tstamp;
1211
  Ptr<const Packet> peekedPacket = m_queue->PeekByTidAndAddress (&hdr,
1211
  Ptr<const Packet> peekedPacket = m_baManager->GetNextPacket (hdr);
1212
                                                                 m_currentHdr.GetQosTid (),
1213
                                                                 WifiMacHeader::ADDR1,
1214
                                                                 m_currentHdr.GetAddr1 (),
1215
                                                                 &tstamp);
1216
  if (peekedPacket == 0)
1212
  if (peekedPacket == 0)
1217
    {
1213
    {
1214
      peekedPacket = m_queue->PeekByTidAndAddress (&hdr,
1215
                                                   m_currentHdr.GetQosTid (),
1216
                                                   WifiMacHeader::ADDR1,
1217
                                                   m_currentHdr.GetAddr1 (),
1218
                                                   &tstamp);
1219
    }
1220
  if ((m_currentHdr.IsQosBlockAck () && peekedPacket == 0) || m_baManager->HasBar (m_currentBar))
1221
    {
1222
      SendBlockAckRequest (m_currentBar);
1223
      return;
1224
    }
1225
  else if (peekedPacket == 0)
1226
    {
1218
      if (txopLimit > NanoSeconds (0))
1227
      if (txopLimit > NanoSeconds (0))
1219
        {
1228
        {
1220
          NS_ASSERT (Simulator::Now () - m_startTxop <= txopLimit);
1229
          NS_ASSERT (Simulator::Now () - m_startTxop <= txopLimit);
 Lines 1222-1230    Link Here 
1222
        }
1231
        }
1223
      return;
1232
      return;
1224
    }
1233
    }
1225
    
1226
  MacLowTransmissionParameters params;
1234
  MacLowTransmissionParameters params;
1227
  params.DisableOverrideDurationId ();
1235
  params.DisableOverrideDurationId ();
1236
  params.DisableNextData ();
1228
  if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
1237
  if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
1229
    {
1238
    {
1230
      params.DisableAck ();
1239
      params.DisableAck ();
 Lines 1233-1249    Link Here 
1233
    {
1242
    {
1234
      params.EnableAck ();
1243
      params.EnableAck ();
1235
    }
1244
    }
1236
    
1237
  WifiTxVector dataTxVector = m_stationManager->GetDataTxVector (m_currentHdr.GetAddr1 (), &m_currentHdr, peekedPacket);
1238
  if (m_stationManager->NeedRts (m_currentHdr.GetAddr1 (), &m_currentHdr, peekedPacket, dataTxVector))
1239
    {
1240
      params.EnableRts ();
1241
    }
1242
  else
1243
    {
1244
      params.DisableRts ();
1245
    }
1246
1247
  if (txopLimit >= GetLow ()->CalculateOverallTxTime (peekedPacket, &hdr, params))
1245
  if (txopLimit >= GetLow ()->CalculateOverallTxTime (peekedPacket, &hdr, params))
1248
    {
1246
    {
1249
      NS_LOG_DEBUG ("start next packet");
1247
      NS_LOG_DEBUG ("start next packet");
 Lines 1251-1257    Link Here 
1251
                                                         m_currentHdr.GetQosTid (),
1249
                                                         m_currentHdr.GetQosTid (),
1252
                                                         WifiMacHeader::ADDR1,
1250
                                                         WifiMacHeader::ADDR1,
1253
                                                         m_currentHdr.GetAddr1 ());
1251
                                                         m_currentHdr.GetAddr1 ());
1252
      m_currentHdr = hdr;
1253
      NS_ASSERT (m_currentPacket != 0);
1254
      uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
1255
      m_currentHdr.SetSequenceNumber (sequence);
1256
      m_stationManager->UpdateFragmentationThreshold ();
1257
      m_currentHdr.SetFragmentNumber (0);
1258
      m_currentHdr.SetNoMoreFragments ();
1259
      m_currentHdr.SetNoRetry ();
1260
      m_fragmentNumber = 0;
1261
      VerifyBlockAck ();
1254
      GetLow ()->StartTransmission (m_currentPacket, &m_currentHdr, params, m_transmissionListener);
1262
      GetLow ()->StartTransmission (m_currentPacket, &m_currentHdr, params, m_transmissionListener);
1263
      if (!GetAmpduExist (m_currentHdr.GetAddr1 ()))
1264
        {
1265
          CompleteTx ();
1266
        }
1255
    }
1267
    }
1256
  else if (txopLimit > NanoSeconds (0))
1268
  else if (txopLimit > NanoSeconds (0))
1257
    {
1269
    {
 Lines 1304-1320    Link Here 
1304
      params.EnableAck ();
1316
      params.EnableAck ();
1305
    }
1317
    }
1306
1318
1307
  WifiTxVector dataTxVector = m_stationManager->GetDataTxVector (m_currentHdr.GetAddr1 (), &m_currentHdr, peekedPacket);
1319
  Time duration = GetLow ()->CalculateOverallTxTime (peekedPacket, &hdr, params);
1308
  if (m_stationManager->NeedRts (m_currentHdr.GetAddr1 (), &m_currentHdr, peekedPacket, dataTxVector))
1320
  if (m_currentPacket != 0)
1309
    {
1321
    {
1310
      params.EnableRts ();
1322
      //take into account current transmission in duration
1323
      duration += GetLow ()->CalculateOverallTxTime (m_currentPacket, &m_currentHdr, params);
1311
    }
1324
    }
1312
  else
1325
  return (GetTxopRemaining () >= duration);
1313
    {
1314
      params.DisableRts ();
1315
    }
1316
1317
  return (GetTxopRemaining () >= GetLow ()->CalculateOverallTxTime (peekedPacket, &hdr, params));
1318
}
1326
}
1319
1327
1320
void
1328
void
 Lines 1329-1334    Link Here 
1329
{
1337
{
1330
  NS_LOG_FUNCTION (this);
1338
  NS_LOG_FUNCTION (this);
1331
  NS_LOG_DEBUG ("a transmission that did not require an ACK just finished");
1339
  NS_LOG_DEBUG ("a transmission that did not require an ACK just finished");
1340
  if (m_currentHdr.IsQosData ()  && m_currentHdr.IsQosBlockAck () && GetTxopLimit () > NanoSeconds (0))
1341
    {
1342
      m_txopTrace (m_startTxop, Simulator::Now () - m_startTxop);
1343
    }
1332
  m_currentPacket = 0;
1344
  m_currentPacket = 0;
1333
  m_dcf->ResetCw ();
1345
  m_dcf->ResetCw ();
1334
  m_cwTrace = m_dcf->GetCw ();
1346
  m_cwTrace = m_dcf->GetCw ();
 Lines 1515-1524    Link Here 
1515
    }
1527
    }
1516
  m_currentPacket = 0;
1528
  m_currentPacket = 0;
1517
  m_dcf->ResetCw ();
1529
  m_dcf->ResetCw ();
1518
  m_cwTrace = m_dcf->GetCw ();
1530
  if (!HasTxop ())
1519
  m_backoffTrace = m_rng->GetNext (0, m_dcf->GetCw ());
1531
    {
1520
  m_dcf->StartBackoffNow (m_backoffTrace);
1532
      if (m_currentHdr.IsQosData () && GetTxopLimit () > NanoSeconds (0))
1521
  RestartAccessIfNeeded ();
1533
        {
1534
          m_txopTrace (m_startTxop, Simulator::Now () - m_startTxop);
1535
        }
1536
      m_cwTrace = m_dcf->GetCw ();
1537
      m_backoffTrace = m_rng->GetNext (0, m_dcf->GetCw ());
1538
      m_dcf->StartBackoffNow (m_backoffTrace);
1539
      RestartAccessIfNeeded ();
1540
    }
1522
}
1541
}
1523
1542
1524
void
1543
void
(-)a/src/wifi/model/edca-txop-n.h (-1 / +1 lines)
 Lines 277-283    Link Here 
277
  /**
277
  /**
278
   * Start transmission for the next packet if allowed by the TxopLimit.
278
   * Start transmission for the next packet if allowed by the TxopLimit.
279
   */
279
   */
280
  void StartNext (void);
280
  void StartNextPacket (void);
281
  /**
281
  /**
282
   * Cancel the transmission.
282
   * Cancel the transmission.
283
   */
283
   */
(-)a/src/wifi/model/mac-low.cc (-5 / +16 lines)
 Lines 1013-1022    Link Here 
1013
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
1013
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
1014
                                                 &MacLow::WaitSifsAfterEndTxFragment, this);
1014
                                                 &MacLow::WaitSifsAfterEndTxFragment, this);
1015
        }
1015
        }
1016
      else if (m_currentHdr.IsQosData () && !m_ampdu && m_listener->HasTxop ())
1016
      else if (m_currentHdr.IsQosData () && m_listener->HasTxop ())
1017
        {
1017
        {
1018
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
1018
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
1019
                                                 &MacLow::WaitSifsAfterEndTx, this);
1019
                                                 &MacLow::WaitSifsAfterEndTxPacket, this);
1020
        }
1020
        }
1021
      m_ampdu = false;
1021
      m_ampdu = false;
1022
      if (m_currentHdr.IsQosData ())
1022
      if (m_currentHdr.IsQosData ())
 Lines 1037-1042    Link Here 
1037
      m_blockAckTimeoutEvent.Cancel ();
1037
      m_blockAckTimeoutEvent.Cancel ();
1038
      NotifyAckTimeoutResetNow ();
1038
      NotifyAckTimeoutResetNow ();
1039
      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (), rxSnr, txVector.GetMode (), tag.Get ());
1039
      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (), rxSnr, txVector.GetMode (), tag.Get ());
1040
      if (m_currentHdr.IsQosData () && m_listener->HasTxop ())
1041
        {
1042
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
1043
                                                 &MacLow::WaitSifsAfterEndTxPacket,
1044
                                                 this);
1045
        }
1040
      m_ampdu = false;
1046
      m_ampdu = false;
1041
    }
1047
    }
1042
  else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
1048
  else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
 Lines 1383-1391    Link Here 
1383
  WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
1389
  WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
1384
  uint32_t dataSize = GetSize (packet, hdr);
1390
  uint32_t dataSize = GetSize (packet, hdr);
1385
  txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, m_phy->GetFrequency ());
1391
  txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, m_phy->GetFrequency ());
1392
  txTime += GetSifs ();
1386
  if (params.MustWaitAck ())
1393
  if (params.MustWaitAck ())
1387
    {
1394
    {
1388
      txTime += GetSifs ();
1389
      txTime += GetAckDuration (hdr->GetAddr1 (), dataTxVector);
1395
      txTime += GetAckDuration (hdr->GetAddr1 (), dataTxVector);
1390
    }
1396
    }
1391
  return txTime;
1397
  return txTime;
 Lines 1843-1848    Link Here 
1843
          m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTxFragment, this);
1849
          m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTxFragment, this);
1844
        }
1850
        }
1845
    }
1851
    }
1852
  else if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck () && m_listener->HasTxop ())
1853
    {
1854
      Time delay = txDuration + GetSifs ();
1855
      m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTxPacket, this);
1856
    }
1846
  else
1857
  else
1847
    {
1858
    {
1848
      // since we do not expect any timer to be triggered.
1859
      // since we do not expect any timer to be triggered.
 Lines 2119-2127    Link Here 
2119
}
2130
}
2120
2131
2121
void
2132
void
2122
MacLow::WaitSifsAfterEndTx (void)
2133
MacLow::WaitSifsAfterEndTxPacket (void)
2123
{
2134
{
2124
  m_listener->StartNext ();
2135
  m_listener->StartNextPacket ();
2125
}
2136
}
2126
2137
2127
void
2138
void
(-)a/src/wifi/model/mac-low.h (-4 / +3 lines)
 Lines 113-122    Link Here 
113
  virtual void StartNextFragment (void) = 0;
113
  virtual void StartNextFragment (void) = 0;
114
  /**
114
  /**
115
   * Invoked when ns3::MacLow wants to continue the TXOP.
115
   * Invoked when ns3::MacLow wants to continue the TXOP.
116
   * The listener is expected to call again MacLow::StartTransmission
116
   * The listener is expected to call again MacLow::StartTransmission with the "next" packet to send.
117
   * with the "next" packet to send.
118
   */
117
   */
119
  virtual void StartNext (void) = 0;
118
  virtual void StartNextPacket (void) = 0;
120
  /**
119
  /**
121
   * Invoked if this transmission was canceled
120
   * Invoked if this transmission was canceled
122
   * one way or another. When this method is invoked,
121
   * one way or another. When this method is invoked,
 Lines 1137-1143    Link Here 
1137
   * after completing transmissions.
1136
   * after completing transmissions.
1138
   */
1137
   */
1139
  void WaitSifsAfterEndTxFragment (void);
1138
  void WaitSifsAfterEndTxFragment (void);
1140
  void WaitSifsAfterEndTx (void);
1139
  void WaitSifsAfterEndTxPacket (void);
1141
1140
1142
  /**
1141
  /**
1143
   * A transmission that does not require an ACK has completed.
1142
   * A transmission that does not require an ACK has completed.

Return to bug 2604