|
|
| 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 |
{ |
|
|
| 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); |
|
|
| 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 (); |
|
|
| 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"); |
|
|
| 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 |
{ |
|
|
| 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 |
|
|
| 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 (); |
|
|
| 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 |