wifi: Consider A-MPDU as single packet for PHY processing

This commit is contained in:
Rediet
2019-04-01 11:28:49 +02:00
committed by Stefano Avallone
parent 139264fb9b
commit ebdb0812d9
10 changed files with 558 additions and 576 deletions

View File

@@ -37,18 +37,18 @@ cpp_examples = [
("ofdm-vht-validation", "True", "True"),
("ofdm-he-validation", "True", "True"),
("80211n-mimo --simulationTime=0.1 --step=10", "True", "True"),
("ht-wifi-network --simulationTime=0.1 --frequency=5 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=134", "True", "True"),
("ht-wifi-network --simulationTime=0.1 --frequency=5 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=130", "True", "True"),
("ht-wifi-network --simulationTime=0.1 --frequency=2.4 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=132", "True", "True"),
("ht-wifi-network --simulationTime=0.1 --frequency=2.4 --useRts=1 --minExpectedThroughput=4.5 --maxExpectedThroughput=128", "True", "True"),
("vht-wifi-network --simulationTime=0.1 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=607", "True", "True"),
("ht-wifi-network --simulationTime=0.2 --frequency=5 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=134", "True", "True"),
("ht-wifi-network --simulationTime=0.2 --frequency=5 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=129", "True", "True"),
("ht-wifi-network --simulationTime=0.2 --frequency=2.4 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=132", "True", "True"),
("ht-wifi-network --simulationTime=0.2 --frequency=2.4 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=127", "True", "True"),
("vht-wifi-network --simulationTime=0.2 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=637", "True", "True"),
("vht-wifi-network --simulationTime=0.2 --useRts=1", "True", "True"),
("he-wifi-network --simulationTime=0.25 --frequency=5 --useRts=0 --minExpectedThroughput=6 --maxExpectedThroughput=844", "True", "True"),
("he-wifi-network --simulationTime=0.25 --frequency=5 --useRts=0 --useExtendedBlockAck=1 --minExpectedThroughput=6 --maxExpectedThroughput=1033", "True", "True"),
("he-wifi-network --simulationTime=0.3 --frequency=5 --useRts=0 --useExtendedBlockAck=1 --minExpectedThroughput=6 --maxExpectedThroughput=1033", "True", "True"),
("he-wifi-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745", "True", "True"),
("he-wifi-network --simulationTime=0.25 --frequency=2.4 --useRts=0 --minExpectedThroughput=6 --maxExpectedThroughput=238", "True", "True"),
("he-wifi-network --simulationTime=4 --frequency=2.4 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=224", "True", "True"),
("simple-ht-hidden-stations --simulationTime=1 --enableRts=0 --nMpdus=32 --minExpectedThroughput=59 --maxExpectedThroughput=60", "True", "True"),
("simple-ht-hidden-stations --simulationTime=1.5 --enableRts=0 --nMpdus=32 --minExpectedThroughput=59 --maxExpectedThroughput=60", "True", "True"),
("simple-ht-hidden-stations --simulationTime=1 --enableRts=1 --nMpdus=32 --minExpectedThroughput=57 --maxExpectedThroughput=58", "True", "True"),
("mixed-network --simulationTime=1", "True", "True"),
("wifi-aggregation --simulationTime=1 --verifyResults=1", "True", "True"),

View File

@@ -1655,88 +1655,21 @@ MacLow::ForwardDown (Ptr<const WifiPsdu> psdu, WifiTxVector txVector)
{
m_cfAckInfo.expectCfAck = true;
}
m_phy->SendPacket (psdu->GetPacket (), txVector);
NS_LOG_DEBUG ("Sending non aggregate MPDU");
}
else // S-MPDU or A-MPDU
{
uint32_t queueSize = psdu->GetNMpdus ();
bool last = false;
MpduType mpdutype = NORMAL_MPDU;
txVector.SetAggregation (true);
//Add packet tag
AmpduTag ampdutag;
Time delay = Seconds (0);
Time remainingAmpduDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetFrequency ());
for (auto& mpdu : *PeekPointer (psdu))
if (psdu->IsSingle ())
{
Ptr<Packet> packet = mpdu->GetPacket ()->Copy ();
packet->AddHeader (mpdu->GetHeader ());
AddWifiMacTrailer (packet);
if (queueSize == 1)
{
last = true;
mpdutype = LAST_MPDU_IN_AGGREGATE;
}
MpduAggregator::AddHeaderAndPad (packet, last, psdu->IsSingle ());
if (delay.IsZero ())
{
if (!psdu->IsSingle ())
{
NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
mpdutype = MPDU_IN_AGGREGATE;
}
else
{
NS_LOG_DEBUG ("Sending S-MPDU");
mpdutype = NORMAL_MPDU;
}
}
Time mpduDuration = m_phy->CalculateTxDuration (packet->GetSize (), txVector, m_phy->GetFrequency (), mpdutype, 0);
remainingAmpduDuration -= mpduDuration;
ampdutag.SetRemainingNbOfMpdus (static_cast<uint8_t> (queueSize - 1));
if (queueSize > 1)
{
ampdutag.SetRemainingAmpduDuration (remainingAmpduDuration);
}
else
{
ampdutag.SetRemainingAmpduDuration (NanoSeconds (0));
}
packet->AddPacketTag (ampdutag);
if (delay.IsZero ())
{
m_phy->SendPacket (packet, txVector, mpdutype);
}
else
{
Simulator::Schedule (delay, &MacLow::SendMpdu, this, packet, txVector, mpdutype);
}
if (queueSize > 1)
{
NS_ASSERT (remainingAmpduDuration > Time (0));
delay = delay + mpduDuration;
}
txVector.SetPreambleType (WIFI_PREAMBLE_NONE);
queueSize--;
NS_LOG_DEBUG ("Sending S-MPDU");
}
else
{
NS_LOG_DEBUG ("Sending A-MPDU");
}
}
}
void
MacLow::SendMpdu (Ptr<const Packet> packet, WifiTxVector txVector, MpduType mpdutype)
{
NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
m_phy->SendPacket (packet, txVector, mpdutype);
m_phy->SendPacket (psdu->GetPacket (), txVector);
}
void
@@ -1799,9 +1732,7 @@ MacLow::BlockAckTimeout (void)
m_currentTxop = 0;
m_ampdu = false;
uint8_t tid = GetTid (m_currentPacket->GetPayload (0), m_currentPacket->GetHeader (0));
AmpduTag ampdu;
m_currentPacket->GetPayload (0)->PeekPacketTag (ampdu);
txop->MissedBlockAck (ampdu.GetRemainingNbOfMpdus () + 1);
txop->MissedBlockAck (m_currentPacket->GetNMpdus ());
FlushAggregateQueue (tid);
}
@@ -2727,14 +2658,16 @@ void
MacLow::DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
{
NS_LOG_FUNCTION (this);
AmpduTag ampdu;
bool normalAck = false;
bool ampduSubframe = false; //flag indicating the packet belongs to an A-MPDU and is not a VHT/HE single MPDU
if (aggregatedPacket->RemovePacketTag (ampdu))
NS_ASSERT (txVector.GetPreambleType () != WIFI_PREAMBLE_NONE);
if (txVector.IsAggregation ())
{
ampduSubframe = true;
MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (aggregatedPacket);
MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
auto status = statusPerMpdu.begin ();
NS_ABORT_MSG_IF (packets.size () != statusPerMpdu.size (), "Should have one receive status per MPDU");
WifiMacHeader firsthdr;
(*n).first->PeekHeader (firsthdr);
@@ -2744,62 +2677,71 @@ MacLow::DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr,
if (firsthdr.GetAddr1 () == m_self)
{
bool singleMpdu = (*n).second.GetEof ();
if (singleMpdu)
//Iterate over all MPDUs and notify reception only if status OK
for (; n != packets.end (); ++n, ++status)
{
//If the MPDU is sent as a VHT/HE single MPDU (EOF=1 in A-MPDU subframe header), then the responder sends an ACK.
NS_LOG_DEBUG ("Receive S-MPDU");
ampduSubframe = false;
}
else if (txVector.GetPreambleType () != WIFI_PREAMBLE_NONE || !m_sendAckEvent.IsRunning ())
{
m_sendAckEvent = Simulator::Schedule (ampdu.GetRemainingAmpduDuration () + GetSifs (),
&MacLow::SendBlockAckAfterAmpdu, this,
firsthdr.GetQosTid (),
firsthdr.GetAddr2 (),
firsthdr.GetDuration (),
txVector, rxSnr);
}
if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
{
ReceiveOk ((*n).first, rxSnr, txVector, ampduSubframe);
}
else if (firsthdr.IsData () || firsthdr.IsQosData ())
{
NS_LOG_DEBUG ("Deaggregate packet from " << firsthdr.GetAddr2 () << " with sequence=" << firsthdr.GetSequenceNumber ());
ReceiveOk ((*n).first, rxSnr, txVector, ampduSubframe);
if (firsthdr.IsQosAck ())
(*n).first->PeekHeader (firsthdr);
NS_ABORT_MSG_IF (firsthdr.GetAddr1 () != m_self, "All MPDUs of A-MPDU should have the same destination address");
if (*status) //PER and thus CRC check succeeded
{
NS_LOG_DEBUG ("Normal Ack");
normalAck = true;
}
}
else
{
NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
}
if (ampdu.GetRemainingNbOfMpdus () == 0 && !singleMpdu)
{
if (normalAck)
{
//send block Ack
if (firsthdr.IsBlockAckReq ())
if (singleMpdu)
{
NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack");
//If the MPDU is sent as a VHT/HE single MPDU (EOF=1 in A-MPDU subframe header), then the responder sends an ACK.
NS_LOG_DEBUG ("Receive S-MPDU");
ampduSubframe = false;
}
uint8_t tid = firsthdr.GetQosTid ();
AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
if (it != m_bAckAgreements.end ())
else if (!m_sendAckEvent.IsRunning ())
{
/* See section 11.5.3 in IEEE 802.11 for mean of this timer */
ResetBlockAckInactivityTimerIfNeeded (it->second.first);
NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ());
NS_ASSERT (m_sendAckEvent.IsRunning ());
m_sendAckEvent = Simulator::Schedule (GetSifs (),
&MacLow::SendBlockAckAfterAmpdu, this,
firsthdr.GetQosTid (),
firsthdr.GetAddr2 (),
firsthdr.GetDuration (),
txVector, rxSnr);
}
if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
{
ReceiveOk ((*n).first, rxSnr, txVector, ampduSubframe);
}
else if (firsthdr.IsData () || firsthdr.IsQosData ())
{
NS_LOG_DEBUG ("Deaggregate packet from " << firsthdr.GetAddr2 () << " with sequence=" << firsthdr.GetSequenceNumber ());
ReceiveOk ((*n).first, rxSnr, txVector, ampduSubframe);
if (firsthdr.IsQosAck ())
{
NS_LOG_DEBUG ("Normal Ack");
normalAck = true;
}
}
else
{
NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
}
if (!singleMpdu)
{
if (normalAck)
{
//send block Ack
if (firsthdr.IsBlockAckReq ())
{
NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack");
}
uint8_t tid = firsthdr.GetQosTid ();
AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
if (it != m_bAckAgreements.end ())
{
/* See section 11.5.3 in IEEE 802.11 for mean of this timer */
ResetBlockAckInactivityTimerIfNeeded (it->second.first);
NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ());
NS_ASSERT (m_sendAckEvent.IsRunning ());
}
else
{
NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
}
}
}
}
}
@@ -2807,6 +2749,7 @@ MacLow::DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr,
}
else
{
/* Simple MPDU */
ReceiveOk (aggregatedPacket, rxSnr, txVector, ampduSubframe);
}
}

View File

@@ -488,14 +488,6 @@ private:
* \param txVector the transmit vector
*/
void ForwardDown (Ptr<const WifiPsdu> psdu, WifiTxVector txVector);
/**
* Forward the MPDU down to WifiPhy for transmission. This is called for each MPDU when MPDU aggregation is used.
*
* \param packet the packet
* \param txVector the transmit vector
* \param mpdutype the MPDU type
*/
void SendMpdu (Ptr<const Packet> packet, WifiTxVector txVector, MpduType mpdutype);
/**
* Return a TXVECTOR for the RTS frame given the destination.
* The function consults WifiRemoteStationManager, which controls the rate

View File

@@ -40,14 +40,13 @@ WifiPhyTag::GetInstanceTypeId (void) const
uint32_t
WifiPhyTag::GetSerializedSize (void) const
{
return (sizeof (WifiTxVector) + 2 + 1);
return (sizeof (WifiTxVector) + 1);
}
void
WifiPhyTag::Serialize (TagBuffer i) const
{
i.Write ((uint8_t *)&m_wifiTxVector, sizeof (WifiTxVector));
i.WriteU16 (static_cast<uint16_t> (m_mpduType));
i.WriteU8 (m_frameComplete);
}
@@ -55,23 +54,21 @@ void
WifiPhyTag::Deserialize (TagBuffer i)
{
i.Read ((uint8_t *)&m_wifiTxVector, sizeof (WifiTxVector));
m_mpduType = static_cast<MpduType> (i.ReadU16 ());
m_frameComplete = i.ReadU8 ();
}
void
WifiPhyTag::Print (std::ostream &os) const
{
os << m_wifiTxVector << " " << m_mpduType << " " << m_frameComplete;
os << m_wifiTxVector << " " << m_frameComplete;
}
WifiPhyTag::WifiPhyTag ()
{
}
WifiPhyTag::WifiPhyTag (WifiTxVector txVector, MpduType mpdutype, uint8_t frameComplete)
WifiPhyTag::WifiPhyTag (WifiTxVector txVector, uint8_t frameComplete)
: m_wifiTxVector (txVector),
m_mpduType (mpdutype),
m_frameComplete (frameComplete)
{
}
@@ -82,12 +79,6 @@ WifiPhyTag::GetWifiTxVector (void) const
return m_wifiTxVector;
}
MpduType
WifiPhyTag::GetMpduType (void) const
{
return m_mpduType;
}
uint8_t
WifiPhyTag::GetFrameComplete (void) const
{

View File

@@ -50,20 +50,14 @@ public:
/**
* Constructor
* \param txVector the WifiTxVector
* \param mpdutype the mpduType
* \param frameComplete the frameComplete
*/
WifiPhyTag (WifiTxVector txVector, MpduType mpdutype, uint8_t frameComplete);
WifiPhyTag (WifiTxVector txVector, uint8_t frameComplete);
/**
* Getter for WifiTxVector parameter
* \return the WifiTxVector
*/
WifiTxVector GetWifiTxVector (void) const;
/**
* Getter for mpduType parameter
* \return mpduType the mpduType
*/
MpduType GetMpduType (void) const;
/**
* Getter for frameComplete parameter
* \return the frameComplete parameter, i.e. 0 if the frame is not complete, 1 otherwise.
@@ -79,7 +73,6 @@ public:
private:
WifiTxVector m_wifiTxVector; ///< wifi transmit vector
MpduType m_mpduType; ///< MPDU type
uint8_t m_frameComplete; ///< Used to indicate that TX stopped sending before the end of the frame
};

View File

@@ -36,6 +36,7 @@
#include "wifi-net-device.h"
#include "ht-configuration.h"
#include "he-configuration.h"
#include "mpdu-aggregator.h"
namespace ns3 {
@@ -376,8 +377,7 @@ WifiPhy::GetTypeId (void)
}
WifiPhy::WifiPhy ()
: m_mpdusNum (0),
m_plcpSuccess (false),
: m_plcpSuccess (false),
m_txMpduReferenceNumber (0xffffffff),
m_rxMpduReferenceNumber (0xffffffff),
m_endRxEvent (),
@@ -2340,50 +2340,174 @@ WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txVector, uint16_t fre
void
WifiPhy::NotifyTxBegin (Ptr<const Packet> packet)
{
m_phyTxBeginTrace (packet);
if (IsAmpdu (packet))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (packet);
for (auto & mpdu : mpdus)
{
m_phyTxBeginTrace (mpdu);
}
}
else
{
m_phyTxBeginTrace (packet);
}
}
void
WifiPhy::NotifyTxEnd (Ptr<const Packet> packet)
{
m_phyTxEndTrace (packet);
if (IsAmpdu (packet))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (packet);
for (auto & mpdu : mpdus)
{
m_phyTxEndTrace (mpdu);
}
}
else
{
m_phyTxEndTrace (packet);
}
}
void
WifiPhy::NotifyTxDrop (Ptr<const Packet> packet)
{
m_phyTxDropTrace (packet);
if (IsAmpdu (packet))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (packet);
for (auto & mpdu : mpdus)
{
m_phyTxDropTrace (mpdu);
}
}
else
{
m_phyTxDropTrace (packet);
}
}
void
WifiPhy::NotifyRxBegin (Ptr<const Packet> packet)
{
m_phyRxBeginTrace (packet);
if (IsAmpdu (packet))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (packet);
for (auto & mpdu : mpdus)
{
m_phyRxBeginTrace (mpdu);
}
}
else
{
m_phyRxBeginTrace (packet);
}
}
void
WifiPhy::NotifyRxEnd (Ptr<const Packet> packet)
{
m_phyRxEndTrace (packet);
if (IsAmpdu (packet))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (packet);
for (auto & mpdu : mpdus)
{
m_phyRxEndTrace (mpdu);
}
}
else
{
m_phyRxEndTrace (packet);
}
}
void
WifiPhy::NotifyRxDrop (Ptr<const Packet> packet)
{
m_phyRxDropTrace (packet);
if (IsAmpdu (packet))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (packet);
for (auto & mpdu : mpdus)
{
m_phyRxDropTrace (mpdu);
}
}
else
{
m_phyRxDropTrace (packet);
}
}
void
WifiPhy::NotifyMonitorSniffRx (Ptr<const Packet> packet, uint16_t channelFreqMhz, WifiTxVector txVector,
MpduInfo aMpdu, SignalNoiseDbm signalNoise, std::vector<bool> statusPerMpdu)
SignalNoiseDbm signalNoise, std::vector<bool> statusPerMpdu)
{
m_phyMonitorSniffRxTrace (packet, channelFreqMhz, txVector, aMpdu, signalNoise);
MpduInfo aMpdu;
if (txVector.IsAggregation ())
{
//Expand A-MPDU
aMpdu.mpduRefNumber = ++m_rxMpduReferenceNumber;
std::list<Ptr<const Packet>> ampduSubframes = MpduAggregator::PeekAmpduSubframes (packet);
size_t numberOfMpdus = ampduSubframes.size ();
NS_ABORT_MSG_IF (statusPerMpdu.size () != numberOfMpdus, "Should have one reception status per MPDU");
size_t i = 0;
for (const auto & subframe : ampduSubframes)
{
if (!statusPerMpdu.at (i)) //packet received with error, do not hand over to sniffer
{
continue;
}
if (i == (numberOfMpdus - 1)) //single MPDU or last MPDU. TODO: see if still compatible with EOF padding
{
aMpdu.type = LAST_MPDU_IN_AGGREGATE;
}
else
{
aMpdu.type = MPDU_IN_AGGREGATE;
}
m_phyMonitorSniffRxTrace (subframe, channelFreqMhz, txVector, aMpdu, signalNoise);
++i;
}
}
else
{
aMpdu.type = NORMAL_MPDU;
NS_ABORT_MSG_IF (statusPerMpdu.size () != 1, "Should have one reception status for normal MPDU");
m_phyMonitorSniffRxTrace (packet, channelFreqMhz, txVector, aMpdu, signalNoise);
}
}
void
WifiPhy::NotifyMonitorSniffTx (Ptr<const Packet> packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu)
WifiPhy::NotifyMonitorSniffTx (Ptr<const Packet> packet, uint16_t channelFreqMhz, WifiTxVector txVector)
{
m_phyMonitorSniffTxTrace (packet, channelFreqMhz, txVector, aMpdu);
MpduInfo aMpdu;
if (txVector.IsAggregation ())
{
//Expand A-MPDU
aMpdu.mpduRefNumber = ++m_txMpduReferenceNumber;
std::list<Ptr<const Packet>> ampduSubframes = MpduAggregator::PeekAmpduSubframes (packet);
size_t numberOfMpdus = ampduSubframes.size ();
size_t i = 0;
for (const auto & subframe : ampduSubframes)
{
if (i == (numberOfMpdus - 1)) //single MPDU or last MPDU. TODO: see if still compatible with EOF padding
{
aMpdu.type = LAST_MPDU_IN_AGGREGATE;
}
else
{
aMpdu.type = MPDU_IN_AGGREGATE;
}
m_phyMonitorSniffTxTrace (subframe, channelFreqMhz, txVector, aMpdu);
++i;
}
}
else
{
aMpdu.type = NORMAL_MPDU;
m_phyMonitorSniffTxTrace (packet, channelFreqMhz, txVector, aMpdu);
}
}
void
@@ -2393,13 +2517,9 @@ WifiPhy::NotifyEndOfHePreamble (HePreambleParameters params)
}
void
WifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, MpduType mpdutype)
WifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector)
{
NS_LOG_FUNCTION (this << packet << txVector.GetMode ()
<< txVector.GetMode ().GetDataRate (txVector)
<< txVector.GetPreambleType ()
<< +txVector.GetTxPowerLevel ()
<< +mpdutype);
NS_LOG_FUNCTION (this << packet << txVector);
/* Transmission can happen if:
* - we are syncing on a packet. It is the responsibility of the
* MAC layer to avoid doing this but the PHY does nothing to
@@ -2420,7 +2540,7 @@ WifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, MpduType m
return;
}
Time txDuration = CalculateTxDuration (packet->GetSize (), txVector, GetFrequency (), mpdutype, 1);
Time txDuration = CalculateTxDuration (packet->GetSize (), txVector, GetFrequency ());
NS_ASSERT (txDuration.IsStrictlyPositive ());
if (m_endPreambleDetectionEvent.IsRunning ())
@@ -2441,15 +2561,7 @@ WifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, MpduType m
}
NotifyTxBegin (packet);
if ((mpdutype == MPDU_IN_AGGREGATE) && (txVector.GetPreambleType () != WIFI_PREAMBLE_NONE))
{
//send the first MPDU in an MPDU
m_txMpduReferenceNumber++;
}
MpduInfo aMpdu;
aMpdu.type = mpdutype;
aMpdu.mpduRefNumber = m_txMpduReferenceNumber;
NotifyMonitorSniffTx (packet, GetFrequency (), txVector, aMpdu);
NotifyMonitorSniffTx (packet, GetFrequency (), txVector);
m_state->SwitchToTx (txDuration, packet, GetPowerDbm (txVector.GetTxPowerLevel ()), txVector);
Ptr<Packet> newPacket = packet->Copy (); // obtain non-const Packet
@@ -2465,16 +2577,16 @@ WifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, MpduType m
{
isFrameComplete = 0;
}
WifiPhyTag tag (txVector, mpdutype, isFrameComplete);
WifiPhyTag tag (txVector, isFrameComplete);
newPacket->AddPacketTag (tag);
StartTx (newPacket, txVector, txDuration);
}
void
WifiPhy::StartReceiveHeader (Ptr<Packet> packet, WifiTxVector txVector, MpduType mpdutype, Ptr<Event> event, Time rxDuration)
WifiPhy::StartReceiveHeader (Ptr<Packet> packet, WifiTxVector txVector, Ptr<Event> event, Time rxDuration)
{
NS_LOG_FUNCTION (this << packet << txVector.GetMode () << txVector.GetPreambleType () << +mpdutype);
NS_LOG_FUNCTION (this << packet << txVector << event << rxDuration);
NS_ASSERT (!IsStateRx ());
NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
@@ -2483,45 +2595,42 @@ WifiPhy::StartReceiveHeader (Ptr<Packet> packet, WifiTxVector txVector, MpduType
NS_LOG_DEBUG ("snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per);
if (!m_preambleDetectionModel || (m_preambleDetectionModel->IsPreambleDetected (snr, m_channelWidth)))
{
m_state->SwitchToRx (rxDuration);
NotifyRxBegin (packet);
{
m_state->SwitchToRx (rxDuration);
NotifyRxBegin (packet);
m_timeLastPreambleDetected = Simulator::Now ();
if ((txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) && (txVector.GetPreambleType () == WIFI_PREAMBLE_HT_GF))
{
//No legacy PHY header for HT GF
Time remainingPreambleHeaderDuration = CalculatePlcpPreambleAndHeaderDuration (txVector) - GetPreambleDetectionDuration ();
m_endPlcpRxEvent = Simulator::Schedule (remainingPreambleHeaderDuration, &WifiPhy::StartReceivePayload, this,
packet, txVector, mpdutype, event);
}
else
{
//Schedule end of legacy PHY header
Time remainingPreambleAndLegacyHeaderDuration = GetPlcpPreambleDuration (txVector) + GetPlcpHeaderDuration (txVector) - GetPreambleDetectionDuration ();
m_endPlcpRxEvent = Simulator::Schedule (remainingPreambleAndLegacyHeaderDuration, &WifiPhy::ContinueReceiveHeader, this,
packet, txVector, mpdutype, event);
}
m_timeLastPreambleDetected = Simulator::Now ();
Time remainingPreambleHeaderDuration = CalculatePlcpPreambleAndHeaderDuration (txVector) - GetPreambleDetectionDuration ();
if ((txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) && (txVector.GetPreambleType () == WIFI_PREAMBLE_HT_GF))
{
//No legacy PHY header for HT GF
m_endPlcpRxEvent = Simulator::Schedule (remainingPreambleHeaderDuration, &WifiPhy::StartReceivePayload, this,
packet, txVector, event);
}
else
{
//Schedule end of legacy PHY header
Time remainingPreambleAndLegacyHeaderDuration = GetPlcpPreambleDuration (txVector) + GetPlcpHeaderDuration (txVector) - GetPreambleDetectionDuration ();
m_endPlcpRxEvent = Simulator::Schedule (remainingPreambleAndLegacyHeaderDuration, &WifiPhy::ContinueReceiveHeader, this,
packet, txVector, event);
}
NS_ASSERT (m_endRxEvent.IsExpired ());
m_endRxEvent = Simulator::Schedule (rxDuration, &WifiPhy::EndReceive, this,
packet, txVector.GetPreambleType (), mpdutype, event);
}
NS_ASSERT (m_endRxEvent.IsExpired ());
m_endRxEvent = Simulator::Schedule (rxDuration, &WifiPhy::EndReceive, this,
packet, txVector, rxDuration - remainingPreambleHeaderDuration, event);
}
else
{
NS_LOG_DEBUG ("Drop packet because PHY preamble detection failed");
NotifyRxDrop (packet);
m_mpdusNum = 0;
m_plcpSuccess = false;
m_interference.NotifyRxEnd ();
}
{
NS_LOG_DEBUG ("Drop packet because PHY preamble detection failed");
NotifyRxDrop (packet);
m_plcpSuccess = false;
}
}
void
WifiPhy::ContinueReceiveHeader (Ptr<Packet> packet, WifiTxVector txVector, MpduType mpdutype, Ptr<Event> event)
WifiPhy::ContinueReceiveHeader (Ptr<Packet> packet, WifiTxVector txVector, Ptr<Event> event)
{
NS_LOG_FUNCTION (this << packet << txVector.GetMode () << txVector.GetPreambleType () << +mpdutype);
NS_LOG_FUNCTION (this << packet << txVector << event);
NS_ASSERT (IsStateRx ());
NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
@@ -2534,7 +2643,7 @@ WifiPhy::ContinueReceiveHeader (Ptr<Packet> packet, WifiTxVector txVector, MpduT
m_plcpSuccess = true;
Time remainingPreambleHeaderDuration = CalculatePlcpPreambleAndHeaderDuration (txVector) - GetPlcpPreambleDuration (txVector) - GetPlcpHeaderDuration (txVector);
m_endPlcpRxEvent = Simulator::Schedule (remainingPreambleHeaderDuration, &WifiPhy::StartReceivePayload, this,
packet, txVector, mpdutype, event);
packet, txVector, event);
}
else //legacy PHY header reception failed
{
@@ -2547,6 +2656,7 @@ WifiPhy::ContinueReceiveHeader (Ptr<Packet> packet, WifiTxVector txVector, MpduT
void
WifiPhy::StartReceivePreamble (Ptr<Packet> packet, double rxPowerW, Time rxDuration)
{
NS_LOG_FUNCTION (this << packet << rxPowerW << rxDuration);
WifiPhyTag tag;
bool found = packet->RemovePacketTag (tag);
if (!found)
@@ -2597,7 +2707,6 @@ WifiPhy::StartReceivePreamble (Ptr<Packet> packet, double rxPowerW, Time rxDurat
}
}
MpduType mpdutype = tag.GetMpduType ();
switch (m_state->GetState ())
{
case WifiPhyState::SWITCHING:
@@ -2628,7 +2737,7 @@ WifiPhy::StartReceivePreamble (Ptr<Packet> packet, double rxPowerW, Time rxDurat
{
AbortCurrentReception ();
NS_LOG_DEBUG ("Switch to new packet");
StartRx (packet, txVector, mpdutype, rxPowerW, rxDuration, event);
StartRx (packet, txVector, rxPowerW, rxDuration, event);
}
else
{
@@ -2658,7 +2767,7 @@ WifiPhy::StartReceivePreamble (Ptr<Packet> packet, double rxPowerW, Time rxDurat
break;
case WifiPhyState::CCA_BUSY:
case WifiPhyState::IDLE:
StartRx (packet, txVector, mpdutype, rxPowerW, rxDuration, event);
StartRx (packet, txVector, rxPowerW, rxDuration, event);
break;
case WifiPhyState::SLEEP:
NS_LOG_DEBUG ("Drop packet because in sleep mode");
@@ -2687,9 +2796,9 @@ WifiPhy::MaybeCcaBusyDuration ()
}
void
WifiPhy::StartReceivePayload (Ptr<Packet> packet, WifiTxVector txVector, MpduType mpdutype, Ptr<Event> event)
WifiPhy::StartReceivePayload (Ptr<Packet> packet, WifiTxVector txVector, Ptr<Event> event)
{
NS_LOG_FUNCTION (this << packet << txVector.GetMode () << txVector.GetPreambleType () << +mpdutype);
NS_LOG_FUNCTION (this << packet << txVector << event);
NS_ASSERT (IsStateRx ());
NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
WifiMode txMode = txVector.GetMode ();
@@ -2733,60 +2842,117 @@ WifiPhy::StartReceivePayload (Ptr<Packet> packet, WifiTxVector txVector, MpduTyp
}
void
WifiPhy::EndReceive (Ptr<Packet> packet, WifiPreamble preamble, MpduType mpdutype, Ptr<Event> event)
WifiPhy::EndReceive (Ptr<Packet> packet, WifiTxVector txVector, Time psduDuration, Ptr<Event> event)
{
NS_LOG_FUNCTION (this << packet << event);
NS_LOG_FUNCTION (this << packet << txVector << psduDuration << event);
NS_ASSERT (IsStateRx ());
NS_ASSERT (event->GetEndTime () == Simulator::Now ());
InterferenceHelper::SnrPer snrPer;
snrPer = m_interference.CalculatePayloadSnrPer (event, std::make_pair (NanoSeconds (0), Simulator::Now () - event->GetStartTime ())); //TODO update with correct MPDU relative start and stop times
m_interference.NotifyRxEnd ();
m_currentEvent = 0;
double snr = m_interference.CalculateSnr (event);
std::vector<bool> statusPerMpdu;
SignalNoiseDbm signalNoise;
Time relativeStart = NanoSeconds (0);
if (m_plcpSuccess == true)
{
NS_LOG_DEBUG ("mode=" << (event->GetPayloadMode ().GetDataRate (event->GetTxVector ())) <<
", snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per << ", size=" << packet->GetSize ());
//
// There are two error checks: PER and receive error model check.
// PER check models is typical for Wi-Fi and is based on signal modulation;
// Receive error model is optional, if we have an error model and
// it indicates that the packet is corrupt, drop the packet.
//
if (m_random->GetValue () > snrPer.per &&
!(m_postReceptionErrorModel && m_postReceptionErrorModel->IsCorrupt (packet)))
bool receptionOkAtLeastForOneMpdu = true;
std::pair<bool, SignalNoiseDbm> rxInfo;
if (txVector.IsAggregation ())
{
NotifyRxEnd (packet);
SignalNoiseDbm signalNoise;
signalNoise.signal = WToDbm (event->GetRxPowerW ());
signalNoise.noise = WToDbm (event->GetRxPowerW () / snrPer.snr);
MpduInfo aMpdu;
aMpdu.type = mpdutype;
aMpdu.mpduRefNumber = m_rxMpduReferenceNumber;
std::vector<bool> statusPerMpdu {true}; //TODO update when A-MPDUs are handled as single packet
NotifyMonitorSniffRx (packet, GetFrequency (), event->GetTxVector (), aMpdu, signalNoise, statusPerMpdu);
m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetTxVector (), statusPerMpdu);
//Extract all MPDUs of the A-MPDU to compute per-MPDU PER stats
//TODO remove PLCP header first
std::list<Ptr<const Packet>> ampduSubframes = MpduAggregator::PeekAmpduSubframes (packet);
size_t nbOfRemainingMpdus = ampduSubframes.size ();
Time remainingAmpduDuration = psduDuration;
MpduType mpdutype = (nbOfRemainingMpdus == 1) ? NORMAL_MPDU : MPDU_IN_AGGREGATE;
WifiTxVector tempTxVector = txVector; //transient solution (to remove once WIFI_PREAMBLE_NONE has been cleaned up)
for (const auto & subframe : ampduSubframes)
{
Time mpduDuration = GetPayloadDuration (subframe->GetSize (), tempTxVector, GetFrequency (), mpdutype, 1);
remainingAmpduDuration -= mpduDuration;
--nbOfRemainingMpdus;
if (nbOfRemainingMpdus == 0 && !remainingAmpduDuration.IsZero ()) //no more MPDU coming
{
mpduDuration += remainingAmpduDuration; //apply a correction just in case rounding had induced slight shift
}
rxInfo = GetReceptionStatus (MpduAggregator::PeekMpduInAmpduSubframe (subframe), txVector, relativeStart, mpduDuration, event);
NS_LOG_DEBUG ("Extracted MPDU #" << ampduSubframes.size () - nbOfRemainingMpdus - 1 << ": duration: " << mpduDuration.GetNanoSeconds () << "ns" <<
", correct reception: " << rxInfo.first <<
", Signal/Noise: " << rxInfo.second.signal << "/" << rxInfo.second.noise << "dBm");
signalNoise = rxInfo.second; //same information for all MPDUs
statusPerMpdu.push_back (rxInfo.first);
receptionOkAtLeastForOneMpdu |= rxInfo.first;
relativeStart += mpduDuration;
tempTxVector.SetPreambleType (WIFI_PREAMBLE_NONE);
}
}
else
{
/* failure. */
NotifyRxDrop (packet);
m_state->SwitchFromRxEndError (packet, snrPer.snr);
//Simple MPDU
rxInfo = GetReceptionStatus (packet, txVector, relativeStart, psduDuration, event);
signalNoise = rxInfo.second; //same information for all MPDUs
statusPerMpdu.push_back (rxInfo.first);
receptionOkAtLeastForOneMpdu = rxInfo.first;
}
if (receptionOkAtLeastForOneMpdu)
{
NotifyMonitorSniffRx (packet, GetFrequency (), txVector, signalNoise, statusPerMpdu);
m_state->SwitchFromRxEndOk (packet, snr, txVector, statusPerMpdu);
}
else
{
m_state->SwitchFromRxEndError (packet, snr);
}
}
else
{
m_state->SwitchFromRxEndError (packet, snrPer.snr);
/* failure of whole PSDU because of PLCP preamble/header error */
m_state->SwitchFromRxEndError (packet, snr);
}
if ((mpdutype == NORMAL_MPDU) || (preamble == WIFI_PREAMBLE_NONE && mpdutype == LAST_MPDU_IN_AGGREGATE))
m_interference.NotifyRxEnd ();
m_currentEvent = 0;
m_plcpSuccess = false;
}
std::pair<bool, SignalNoiseDbm>
WifiPhy::GetReceptionStatus (Ptr<const Packet> mpdu, WifiTxVector txVector, Time relativeMpduStart, Time mpduDuration, Ptr<Event> event)
{
NS_LOG_FUNCTION (this << mpdu << txVector << relativeMpduStart << mpduDuration << event);
InterferenceHelper::SnrPer snrPer;
snrPer = m_interference.CalculatePayloadSnrPer (event, std::make_pair (relativeMpduStart, relativeMpduStart + mpduDuration));
NS_LOG_DEBUG ("mode=" << (txVector.GetMode ().GetDataRate (txVector)) <<
", snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per << ", size=" << mpdu->GetSize () <<
", relativeStart = " << relativeMpduStart.GetNanoSeconds () << "ns, duration = " << mpduDuration.GetNanoSeconds () << "ns");
//
// There are two error checks: PER and receive error model check.
// PER check models is typical for Wi-Fi and is based on signal modulation;
// Receive error model is optional, if we have an error model and
// it indicates that the packet is corrupt, drop the packet.
//
SignalNoiseDbm signalNoise;
signalNoise.signal = WToDbm (event->GetRxPowerW ());
signalNoise.noise = WToDbm (event->GetRxPowerW () / snrPer.snr);
if (m_random->GetValue () > snrPer.per &&
!(m_postReceptionErrorModel && m_postReceptionErrorModel->IsCorrupt (mpdu->Copy ())))
{
m_plcpSuccess = false;
m_mpdusNum = 0;
NS_LOG_DEBUG ("Reception OK: " << mpdu->ToString ());
NotifyRxEnd (mpdu);
return std::make_pair (true, signalNoise);
}
else
{
NS_LOG_DEBUG ("Reception failed: " << mpdu->ToString ());
NotifyRxDrop (mpdu);
return std::make_pair (false, signalNoise);
}
}
@@ -3821,95 +3987,41 @@ WifiPhy::AbortCurrentReception ()
m_state->SwitchFromRxAbort ();
m_currentEvent = 0;
m_plcpSuccess = false;
m_mpdusNum = 0;
}
void
WifiPhy::StartRx (Ptr<Packet> packet, WifiTxVector txVector, MpduType mpdutype, double rxPowerW, Time rxDuration, Ptr<Event> event)
WifiPhy::StartRx (Ptr<Packet> packet, WifiTxVector txVector, double rxPowerW, Time rxDuration, Ptr<Event> event)
{
NS_LOG_FUNCTION (this << packet << txVector << +mpdutype << rxPowerW << rxDuration);
AmpduTag ampduTag;
WifiPreamble preamble = txVector.GetPreambleType ();
if (preamble == WIFI_PREAMBLE_NONE && (m_mpdusNum == 0 || m_plcpSuccess == false))
{
m_plcpSuccess = false;
m_mpdusNum = 0;
NS_LOG_DEBUG ("drop packet because no PLCP preamble/header has been received");
NotifyRxDrop (packet);
MaybeCcaBusyDuration ();
return;
}
NS_LOG_FUNCTION (this << packet << txVector << rxPowerW << rxDuration);
NS_ABORT_MSG_IF (txVector.GetPreambleType () == WIFI_PREAMBLE_NONE, "Packet should have PLCP preamble");
NS_LOG_DEBUG ("sync to signal (power=" << rxPowerW << "W)");
m_interference.NotifyRxStart (); //We need to notify it now so that it starts recording events
if (preamble == WIFI_PREAMBLE_NONE)
if (!m_endPreambleDetectionEvent.IsRunning ())
{
NS_ASSERT (m_endPreambleDetectionEvent.IsExpired ());
if (packet->PeekPacketTag (ampduTag) && m_mpdusNum > 0)
{
//received the other MPDUs that are part of the A-MPDU
if (ampduTag.GetRemainingNbOfMpdus () < (m_mpdusNum - 1))
{
NS_LOG_DEBUG ("Missing MPDU from the A-MPDU " << m_mpdusNum - ampduTag.GetRemainingNbOfMpdus ());
m_mpdusNum = ampduTag.GetRemainingNbOfMpdus ();
}
else
{
m_mpdusNum--;
}
}
m_state->SwitchToRx (rxDuration);
NotifyRxBegin (packet);
NS_ASSERT (m_endRxEvent.IsExpired ());
m_endRxEvent = Simulator::Schedule (rxDuration, &WifiPhy::EndReceive, this,
packet, txVector.GetPreambleType (), mpdutype, event);
m_plcpSuccess = false;
Time startOfPreambleDuration = GetPreambleDetectionDuration ();
Time remainingRxDuration = rxDuration - startOfPreambleDuration;
m_endPreambleDetectionEvent = Simulator::Schedule (startOfPreambleDuration, &WifiPhy::StartReceiveHeader, this,
packet, txVector, event, remainingRxDuration);
}
else if ((m_frameCaptureModel != 0) && (rxPowerW > m_currentEvent->GetRxPowerW ()))
{
NS_LOG_DEBUG ("Received a stronger signal during preamble detection: drop current packet and switch to new packet");
NotifyRxDrop (m_currentEvent->GetPacket ());
m_interference.NotifyRxEnd ();
m_endPreambleDetectionEvent.Cancel ();
m_plcpSuccess = false;
m_interference.NotifyRxStart ();
Time startOfPreambleDuration = GetPreambleDetectionDuration ();
Time remainingRxDuration = rxDuration - startOfPreambleDuration;
m_endPreambleDetectionEvent = Simulator::Schedule (startOfPreambleDuration, &WifiPhy::StartReceiveHeader, this,
packet, txVector, event, remainingRxDuration);
}
else
{
if (!m_endPreambleDetectionEvent.IsRunning ())
{
m_plcpSuccess = false;
m_mpdusNum = 0;
if (packet->PeekPacketTag (ampduTag))
{
m_mpdusNum = ampduTag.GetRemainingNbOfMpdus ();
NS_LOG_DEBUG ("Received the first MPDU in an A-MPDU, remaining number of MPDUs to be received: " << m_mpdusNum);
m_rxMpduReferenceNumber++;
}
Time startOfPreambleDuration = GetPreambleDetectionDuration ();
Time remainingRxDuration = rxDuration - startOfPreambleDuration;
m_endPreambleDetectionEvent = Simulator::Schedule (startOfPreambleDuration, &WifiPhy::StartReceiveHeader, this,
packet, txVector, mpdutype, event, remainingRxDuration);
}
else if ((m_frameCaptureModel != 0) && (rxPowerW > m_currentEvent->GetRxPowerW ()))
{
NS_LOG_DEBUG ("Received a stronger signal during preamble detection: drop current packet and switch to new packet");
NotifyRxDrop (m_currentEvent->GetPacket ());
m_interference.NotifyRxEnd ();
m_endPreambleDetectionEvent.Cancel ();
m_plcpSuccess = false;
m_mpdusNum = 0;
if (packet->PeekPacketTag (ampduTag))
{
m_mpdusNum = ampduTag.GetRemainingNbOfMpdus ();
NS_LOG_DEBUG ("Received the first MPDU in an A-MPDU, remaining number of MPDUs to be received: " << m_mpdusNum);
m_rxMpduReferenceNumber++;
}
m_interference.NotifyRxStart ();
Time startOfPreambleDuration = GetPreambleDetectionDuration ();
Time remainingRxDuration = rxDuration - startOfPreambleDuration;
m_endPreambleDetectionEvent = Simulator::Schedule (startOfPreambleDuration, &WifiPhy::StartReceiveHeader, this,
packet, txVector, mpdutype, event, remainingRxDuration);
}
else
{
NS_LOG_DEBUG ("Drop packet because RX is already decoding preamble");
NotifyRxDrop (packet);
}
NS_LOG_DEBUG ("Drop packet because RX is already decoding preamble");
NotifyRxDrop (packet);
}
m_currentEvent = event;
}

View File

@@ -137,12 +137,10 @@ public:
*
* \param packet the arriving packet
* \param txVector the TXVECTOR of the arriving packet
* \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
* \param event the corresponding event of the first time the packet arrives
*/
void StartReceiveHeader (Ptr<Packet> packet,
WifiTxVector txVector,
MpduType mpdutype,
Ptr<Event> event,
Time rxDuration);
@@ -151,12 +149,10 @@ public:
*
* \param packet the arriving packet
* \param txVector the TXVECTOR of the arriving packet
* \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
* \param event the corresponding event of the first time the packet arrives
*/
void ContinueReceiveHeader (Ptr<Packet> packet,
WifiTxVector txVector,
MpduType mpdutype,
Ptr<Event> event);
/**
@@ -164,32 +160,32 @@ public:
*
* \param packet the arriving packet
* \param txVector the TXVECTOR of the arriving packet
* \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
* \param event the corresponding event of the first time the packet arrives
*/
void StartReceivePayload (Ptr<Packet> packet,
WifiTxVector txVector,
MpduType mpdutype,
Ptr<Event> event);
/**
* The last bit of the packet has arrived.
*
* \param packet the packet that the last bit has arrived
* \param preamble the preamble of the arriving packet
* \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
* \param txVector the TXVECTOR of the arriving packet
* \param psduDuration the duration of the PSDU
* \param event the corresponding event of the first time the packet arrives
*/
void EndReceive (Ptr<Packet> packet, WifiPreamble preamble, MpduType mpdutype, Ptr<Event> event);
void EndReceive (Ptr<Packet> packet,
WifiTxVector txVector,
Time psduDuration,
Ptr<Event> event);
/**
* \param packet the packet to send
* \param txVector the TXVECTOR that has tx parameters such as mode, the transmission mode to use to send
* this packet, and txPowerLevel, a power level to use to send this packet. The real transmission
* power is calculated as txPowerMin + txPowerLevel * (txPowerMax - txPowerMin) / nTxLevels
* \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
*/
void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, MpduType mpdutype = NORMAL_MPDU);
void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector);
/**
* \param packet the packet to send
@@ -1145,6 +1141,9 @@ public:
/**
* Public method used to fire a MonitorSniffer trace for a wifi packet being received.
* Implemented for encapsulation purposes.
* This method will extract all MPDUs if packet is an A-MPDU and will fire tracedCallback.
* The A-MPDU reference number (RX side) is set within the method. It must be a different value
* for each A-MPDU but the same for each subframe within one A-MPDU.
*
* \param packet the packet being received
* \param channelFreqMhz the frequency in MHz at which the packet is
@@ -1155,15 +1154,12 @@ public:
* tuned on a given channel and still to be able to receive packets
* on a nearby channel.
* \param txVector the TXVECTOR that holds rx parameters
* \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
* and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
* \param signalNoise signal power and noise power in dBm (noise power includes the noise figure)
* \param statusPerMpdu reception status per MPDU
*/
void NotifyMonitorSniffRx (Ptr<const Packet> packet,
uint16_t channelFreqMhz,
WifiTxVector txVector,
MpduInfo aMpdu,
SignalNoiseDbm signalNoise,
std::vector<bool> statusPerMpdu);
@@ -1195,18 +1191,18 @@ public:
/**
* Public method used to fire a MonitorSniffer trace for a wifi packet being transmitted.
* Implemented for encapsulation purposes.
* This method will extract all MPDUs if packet is an A-MPDU and will fire tracedCallback.
* The A-MPDU reference number (RX side) is set within the method. It must be a different value
* for each A-MPDU but the same for each subframe within one A-MPDU.
*
* \param packet the packet being transmitted
* \param channelFreqMhz the frequency in MHz at which the packet is
* transmitted.
* \param txVector the TXVECTOR that holds tx parameters
* \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
* and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
*/
void NotifyMonitorSniffTx (Ptr<const Packet> packet,
uint16_t channelFreqMhz,
WifiTxVector txVector,
MpduInfo aMpdu);
WifiTxVector txVector);
/**
* TracedCallback signature for monitor mode transmit events.
@@ -1583,8 +1579,7 @@ protected:
Ptr<UniformRandomVariable> m_random; //!< Provides uniform random variables.
Ptr<WifiPhyStateHelper> m_state; //!< Pointer to WifiPhyStateHelper
uint16_t m_mpdusNum; //!< carries the number of expected mpdus that are part of an A-MPDU
bool m_plcpSuccess; //!< Flag if the PLCP of the packet or the first MPDU in an A-MPDU has been received
bool m_plcpSuccess; //!< Flag if the PLCP of the packet has been received
uint32_t m_txMpduReferenceNumber; //!< A-MPDU reference number to identify all transmitted subframes belonging to the same received A-MPDU
uint32_t m_rxMpduReferenceNumber; //!< A-MPDU reference number to identify all received subframes belonging to the same received A-MPDU
@@ -1703,17 +1698,31 @@ private:
*
* \param packet the arriving packet
* \param txVector the TXVECTOR of the arriving packet
* \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
* \param rxPowerW the receive power in W
* \param rxDuration the duration needed for the reception of the packet
* \param event the corresponding event of the first time the packet arrives
*/
void StartRx (Ptr<Packet> packet,
WifiTxVector txVector,
MpduType mpdutype,
double rxPowerW,
Time rxDuration,
Ptr<Event> event);
/**
* Get the reception status for the provided MPDU and notify.
*
* \param mpdu the arriving MPDU
* \param txVector the TXVECTOR of the arriving packet
* \param relativeMpduStart the relative start time of the MPDU within the A-MPDU. 0 for normal MPDUs
* \param mpduDuration the duration of the MPDU
* \param event the corresponding event of the first time the packet arrives
*
* \return information on MPDU reception: status, signal power (dBm), and noise power (in dBm)
*/
std::pair<bool, SignalNoiseDbm> GetReceptionStatus (Ptr<const Packet> mpdu,
WifiTxVector txVector,
Time relativeMpduStart,
Time mpduDuration,
Ptr<Event> event);
/**
* The trace source fired when a packet begins the transmission process on

View File

@@ -106,7 +106,6 @@ Ptr<SpectrumSignalParameters>
SpectrumWifiPhyBasicTest::MakeSignal (double txPowerWatts)
{
WifiTxVector txVector = WifiTxVector (WifiPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, false, 1, 1, 0, 20, false, false);
MpduType mpdutype = NORMAL_MPDU;
Ptr<Packet> pkt = Create<Packet> (1000);
WifiMacHeader hdr;
@@ -115,12 +114,12 @@ SpectrumWifiPhyBasicTest::MakeSignal (double txPowerWatts)
hdr.SetType (WIFI_MAC_QOSDATA);
hdr.SetQosTid (0);
uint32_t size = pkt->GetSize () + hdr.GetSize () + trailer.GetSerializedSize ();
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency (), mpdutype, 0);
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency ());
hdr.SetDuration (txDuration);
pkt->AddHeader (hdr);
pkt->AddTrailer (trailer);
WifiPhyTag tag (txVector, mpdutype, 1);
WifiPhyTag tag (txVector, 1);
pkt->AddPacketTag (tag);
Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, txPowerWatts, GUARD_WIDTH);
Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();

View File

@@ -35,6 +35,9 @@
#include "ns3/wifi-utils.h"
#include "ns3/threshold-preamble-detection-model.h"
#include "ns3/simple-frame-capture-model.h"
#include "ns3/wifi-psdu.h"
#include "ns3/wifi-mac-queue-item.h"
#include "ns3/mpdu-aggregator.h"
using namespace ns3;
@@ -108,7 +111,6 @@ void
TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket (double txPowerDbm)
{
WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs11 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false, false);
MpduType mpdutype = NORMAL_MPDU;
Ptr<Packet> pkt = Create<Packet> (1000);
WifiMacHeader hdr;
@@ -117,12 +119,12 @@ TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket (double txPowerDbm
hdr.SetType (WIFI_MAC_QOSDATA);
hdr.SetQosTid (0);
uint32_t size = pkt->GetSize () + hdr.GetSize () + trailer.GetSerializedSize ();
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency (), mpdutype, 0);
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency ());
hdr.SetDuration (txDuration);
pkt->AddHeader (hdr);
pkt->AddTrailer (trailer);
WifiPhyTag tag (txVector, mpdutype, 1);
WifiPhyTag tag (txVector, 1);
pkt->AddPacketTag (tag);
Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (txPowerDbm), GUARD_WIDTH);
Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
@@ -308,7 +310,6 @@ void
TestThresholdPreambleDetectionWithFrameCapture::SendPacket (double txPowerDbm)
{
WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs11 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false, false);
MpduType mpdutype = NORMAL_MPDU;
Ptr<Packet> pkt = Create<Packet> (1000);
WifiMacHeader hdr;
@@ -317,12 +318,12 @@ TestThresholdPreambleDetectionWithFrameCapture::SendPacket (double txPowerDbm)
hdr.SetType (WIFI_MAC_QOSDATA);
hdr.SetQosTid (0);
uint32_t size = pkt->GetSize () + hdr.GetSize () + trailer.GetSerializedSize ();
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency (), mpdutype, 0);
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency ());
hdr.SetDuration (txDuration);
pkt->AddHeader (hdr);
pkt->AddTrailer (trailer);
WifiPhyTag tag (txVector, mpdutype, 1);
WifiPhyTag tag (txVector, 1);
pkt->AddPacketTag (tag);
Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (txPowerDbm), GUARD_WIDTH);
Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
@@ -518,7 +519,6 @@ void
TestSimpleFrameCaptureModel::SendPacket (double txPowerDbm, uint32_t packetSize)
{
WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false, false);
MpduType mpdutype = NORMAL_MPDU;
Ptr<Packet> pkt = Create<Packet> (packetSize);
WifiMacHeader hdr;
@@ -527,12 +527,12 @@ TestSimpleFrameCaptureModel::SendPacket (double txPowerDbm, uint32_t packetSize)
hdr.SetType (WIFI_MAC_QOSDATA);
hdr.SetQosTid (0);
uint32_t size = pkt->GetSize () + hdr.GetSize () + trailer.GetSerializedSize ();
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency (), mpdutype, 0);
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency ());
hdr.SetDuration (txDuration);
pkt->AddHeader (hdr);
pkt->AddTrailer (trailer);
WifiPhyTag tag (txVector, mpdutype, 1);
WifiPhyTag tag (txVector, 1);
pkt->AddPacketTag (tag);
Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (txPowerDbm), GUARD_WIDTH);
Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
@@ -708,6 +708,16 @@ private:
* \param p the packet
*/
void RxDropped (Ptr<const Packet> p);
/**
* Increment reception success bitmap.
* \param size the size of the received packet
*/
void IncrementSuccessBitmap (uint32_t size);
/**
* Increment reception failure bitmap.
* \param size the size of the received packet
*/
void IncrementFailureBitmap (uint32_t size);
/**
* Reset bitmaps function
@@ -715,23 +725,11 @@ private:
void ResetBitmaps();
/**
* schedule send MPDU function
* Send A-MPDU with 3 MPDUs of different size (i-th MSDU will have 100 bytes more than (i-1)-th).
* \param txPowerDbm the transmit power in dBm
* \param packetSize the size of the packet in bytes
* \param preamble the preamble
* \param mpdutype the MPDU type
* \param remainingNbOfMpdus the remaining number of MPDUs to send after this MPDU
* \param referencePacketSize the reference size of the packets in bytes (i-th MSDU will have 100 bytes more than (i-1)-th)
*/
void ScheduleSendMpdu (double txPowerDbm, uint32_t packetSize, WifiPreamble preamble, MpduType mpdutype, uint8_t remainingNbOfMpdus);
/**
* Send MPDU function
* \param txPowerDbm the transmit power in dBm
* \param packetSize the size of the packet in bytes
* \param preamble the preamble
* \param mpdutype the MPDU type
* \param remainingNbOfMpdus the remaining number of MPDUs to send after this MPDU
*/
void SendMpdu (double txPowerDbm, uint32_t packetSize, WifiPreamble preamble, MpduType mpdutype, uint8_t remainingNbOfMpdus);
void SendAmpduWithThreeMpdus (double txPowerDbm, uint32_t referencePacketSize);
/**
* Check the RX success bitmap for A-MPDU 1
@@ -813,27 +811,54 @@ void
TestAmpduReception::RxSuccess (Ptr<Packet> p, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
{
NS_LOG_FUNCTION (this << p << snr << txVector);
if (p->GetSize () == 1030) //A-MPDU 1 - MPDU #1
if (IsAmpdu (p))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (p);
NS_ABORT_MSG_IF (mpdus.size () != statusPerMpdu.size (), "Should have one receive status per MPDU");
auto rxOkForMpdu = statusPerMpdu.begin ();
for (const auto & mpdu : mpdus)
{
if (*rxOkForMpdu)
{
IncrementSuccessBitmap (mpdu->GetSize ());
}
else
{
IncrementFailureBitmap (mpdu->GetSize ());
}
++rxOkForMpdu;
}
}
else
{
IncrementSuccessBitmap (p->GetSize ());
}
}
void
TestAmpduReception::IncrementSuccessBitmap (uint32_t size)
{
if (size == 1030) //A-MPDU 1 - MPDU #1
{
m_rxSuccessBitmapAmpdu1 |= 1;
}
else if (p->GetSize () == 1130) //A-MPDU 1 - MPDU #2
else if (size == 1130) //A-MPDU 1 - MPDU #2
{
m_rxSuccessBitmapAmpdu1 |= (1 << 1);
}
else if (p->GetSize () == 1230) //A-MPDU 1 - MPDU #3
else if (size == 1230) //A-MPDU 1 - MPDU #3
{
m_rxSuccessBitmapAmpdu1 |= (1 << 2);
}
else if (p->GetSize () == 1330) //A-MPDU 2 - MPDU #1
else if (size == 1330) //A-MPDU 2 - MPDU #1
{
m_rxSuccessBitmapAmpdu2 |= 1;
}
else if (p->GetSize () == 1430) //A-MPDU 2 - MPDU #2
else if (size == 1430) //A-MPDU 2 - MPDU #2
{
m_rxSuccessBitmapAmpdu2 |= (1 << 1);
}
else if (p->GetSize () == 1530) //A-MPDU 2 - MPDU #3
else if (size == 1530) //A-MPDU 2 - MPDU #3
{
m_rxSuccessBitmapAmpdu2 |= (1 << 2);
}
@@ -843,27 +868,44 @@ void
TestAmpduReception::RxFailure (Ptr<Packet> p)
{
NS_LOG_FUNCTION (this << p);
if (p->GetSize () == 1030) //A-MPDU 1 - MPDU #1
if (IsAmpdu (p))
{
std::list<Ptr<const Packet>> mpdus = MpduAggregator::PeekMpdus (p);
for (const auto & mpdu : mpdus)
{
IncrementFailureBitmap (mpdu->GetSize ());
}
}
else
{
IncrementFailureBitmap (p->GetSize ());
}
}
void
TestAmpduReception::IncrementFailureBitmap (uint32_t size)
{
if (size == 1030) //A-MPDU 1 - MPDU #1
{
m_rxFailureBitmapAmpdu1 |= 1;
}
else if (p->GetSize () == 1130) //A-MPDU 1 - MPDU #2
else if (size == 1130) //A-MPDU 1 - MPDU #2
{
m_rxFailureBitmapAmpdu1 |= (1 << 1);
}
else if (p->GetSize () == 1230) //A-MPDU 1 - MPDU #3
else if (size == 1230) //A-MPDU 1 - MPDU #3
{
m_rxFailureBitmapAmpdu1 |= (1 << 2);
}
else if (p->GetSize () == 1330) //A-MPDU 2 - MPDU #1
else if (size == 1330) //A-MPDU 2 - MPDU #1
{
m_rxFailureBitmapAmpdu2 |= 1;
}
else if (p->GetSize () == 1430) //A-MPDU 2 - MPDU #2
else if (size == 1430) //A-MPDU 2 - MPDU #2
{
m_rxFailureBitmapAmpdu2 |= (1 << 1);
}
else if (p->GetSize () == 1530) //A-MPDU 2 - MPDU #3
else if (size == 1530) //A-MPDU 2 - MPDU #3
{
m_rxFailureBitmapAmpdu2 |= (1 << 2);
}
@@ -947,33 +989,27 @@ TestAmpduReception::CheckPhyState (WifiPhyState expectedState)
}
void
TestAmpduReception::ScheduleSendMpdu (double txPowerDbm, uint32_t packetSize, WifiPreamble preamble, MpduType mpdutype, uint8_t remainingNbOfMpdus)
TestAmpduReception::SendAmpduWithThreeMpdus (double txPowerDbm, uint32_t referencePacketSize)
{
//This is needed to make sure this is the last scheduled event and to avoid the start of an MPDU is triggered before the end of the previous MPDU.
Simulator::ScheduleNow (&TestAmpduReception::SendMpdu, this, txPowerDbm, packetSize, preamble, mpdutype, remainingNbOfMpdus);
}
WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, true, false);
void
TestAmpduReception::SendMpdu (double txPowerDbm, uint32_t packetSize, WifiPreamble preamble, MpduType mpdutype, uint8_t remainingNbOfMpdus)
{
WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs0 (), 0, preamble, 800, 1, 1, 0, 20, false, false);
Ptr<Packet> pkt = Create<Packet> (packetSize);
WifiMacHeader hdr;
WifiMacTrailer trailer;
hdr.SetType (WIFI_MAC_QOSDATA);
hdr.SetQosTid (0);
uint32_t size = pkt->GetSize () + hdr.GetSize () + trailer.GetSerializedSize ();
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency (), mpdutype, 0);
hdr.SetDuration (txDuration);
std::vector<Ptr<WifiMacQueueItem>> mpduList;
for (size_t i = 0; i < 3; ++i)
{
Ptr<Packet> p = Create<Packet> (referencePacketSize + i * 100);
mpduList.push_back (Create<WifiMacQueueItem> (p, hdr));
}
Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
pkt->AddHeader (hdr);
pkt->AddTrailer (trailer);
AmpduTag ampdutag;
ampdutag.SetRemainingNbOfMpdus (remainingNbOfMpdus);
pkt->AddPacketTag (ampdutag);
WifiPhyTag tag (txVector, mpdutype, 1);
Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetFrequency ());
psdu->SetDuration (txDuration);
Ptr<Packet> pkt = psdu->GetPacket ()->Copy ();
WifiPhyTag tag (txVector, 1);
pkt->AddPacketTag (tag);
Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (txPowerDbm), GUARD_WIDTH);
Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
@@ -1025,14 +1061,10 @@ TestAmpduReception::DoRun (void)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (1.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (1.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (1.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (1.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (1.0) + MicroSeconds (2), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (1.0) + MicroSeconds (2) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (1.0) + MicroSeconds (2) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (1.0) + MicroSeconds (2), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been ignored.
Simulator::Schedule (Seconds (1.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1052,14 +1084,10 @@ TestAmpduReception::DoRun (void)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (2.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (2.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (2.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (2.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (2.0) + MicroSeconds (2), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (2.0) + MicroSeconds (2) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (2.0) + MicroSeconds (2) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (2.0) + MicroSeconds (2), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1300);
// All MPDUs of A-MPDU 1 should have been received.
Simulator::Schedule (Seconds (2.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000111);
@@ -1079,14 +1107,10 @@ TestAmpduReception::DoRun (void)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (3.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (3.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (3.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (3.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (3.0) + MicroSeconds (10), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (3.0) + MicroSeconds (10) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (3.0) + MicroSeconds (10) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (3.0) + MicroSeconds (10), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been ignored.
Simulator::Schedule (Seconds (3.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1106,14 +1130,10 @@ TestAmpduReception::DoRun (void)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (4.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (4.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (4.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (4.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (4.0) + MicroSeconds (10), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (4.0) + MicroSeconds (10) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (4.0) + MicroSeconds (10) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (4.0) + MicroSeconds (10), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1300);
// All MPDUs of A-MPDU 1 should have been received.
Simulator::Schedule (Seconds (4.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000111);
@@ -1133,14 +1153,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (5.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (5.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (5.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (5.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (5.0) + MicroSeconds (100), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (5.0) + MicroSeconds (100) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (5.0) + MicroSeconds (100) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (5.0) + MicroSeconds (100), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been ignored.
Simulator::Schedule (Seconds (5.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1160,14 +1176,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (6.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (6.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (6.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (6.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (6.0) + MicroSeconds (100), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (6.0) + MicroSeconds (100) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (6.0) + MicroSeconds (100) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (6.0) + MicroSeconds (100), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1300);
// All MPDUs of A-MPDU 1 should have been received.
Simulator::Schedule (Seconds (6.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000111);
@@ -1187,14 +1199,10 @@ TestAmpduReception::DoRun (void)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (7.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (7.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (7.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (7.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (7.0) + NanoSeconds (1100000), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (7.0) + NanoSeconds (1100000) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (7.0) + NanoSeconds (1100000) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (7.0) + NanoSeconds (1100000), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been ignored.
Simulator::Schedule (Seconds (7.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1214,14 +1222,10 @@ TestAmpduReception::DoRun (void)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (8.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (8.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (8.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (8.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (8.0) + NanoSeconds (1100000), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (8.0) + NanoSeconds (1100000) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (8.0) + NanoSeconds (1100000) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm - 100, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (8.0) + NanoSeconds (1100000), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm - 100, 1300);
// All MPDUs of A-MPDU 1 should have been received.
Simulator::Schedule (Seconds (8.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000111);
@@ -1241,24 +1245,20 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (9.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (9.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (9.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (9.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (9.0) + MicroSeconds (2), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (9.0) + MicroSeconds (2) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (9.0) + MicroSeconds (2) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (9.0) + MicroSeconds (2), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 3, 1300);
// All MPDUs of A-MPDU 1 should have been dropped.
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxFailureBitmapAmpdu1, this, 0b00000000);
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxDroppedBitmapAmpdu1, this, 0b00000111);
// MPDUs #1 and #2 of A-MPDU 2 should have been received with errors. M/PDU #3 should have been successfully received (it depends on random stream!)
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu2, this, 0b00000100);
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxFailureBitmapAmpdu2, this, 0b00000011);
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxDroppedBitmapAmpdu2, this, 0b00000011);
// All MPDUs of A-MPDU 2 should have been received with errors.
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu2, this, 0b00000000);
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxFailureBitmapAmpdu2, this, 0b00000111);
Simulator::Schedule (Seconds (9.1), &TestAmpduReception::CheckRxDroppedBitmapAmpdu2, this, 0b00000111);
Simulator::Schedule (Seconds (9.2), &TestAmpduReception::ResetBitmaps, this);
@@ -1268,14 +1268,10 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (10.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (10.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (10.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (10.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (10.0) + MicroSeconds (2), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (10.0) + MicroSeconds (2) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (10.0) + MicroSeconds (2) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (10.0) + MicroSeconds (2), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been dropped (preamble detection failed).
Simulator::Schedule (Seconds (10.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1295,14 +1291,10 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (11.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (11.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (11.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (11.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 3, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (11.0) + MicroSeconds (2), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (11.0) + MicroSeconds (2) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (11.0) + MicroSeconds (2) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (11.0) + MicroSeconds (2), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been received with errors.
Simulator::Schedule (Seconds (11.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1322,18 +1314,14 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (12.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (12.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (12.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (12.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (12.0) + MicroSeconds (10), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (12.0) + MicroSeconds (10) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (12.0) + MicroSeconds (10) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (12.0) + MicroSeconds (10), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 3, 1300);
// All MPDUs of A-MPDU 1 should have been dropped (PHY header reception failed).
// All MPDUs of A-MPDU 1 should have been received with errors (PHY header reception failed and thus incorrect decoding of payload).
Simulator::Schedule (Seconds (12.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
Simulator::Schedule (Seconds (12.1), &TestAmpduReception::CheckRxFailureBitmapAmpdu1, this, 0b00000001);
Simulator::Schedule (Seconds (12.1), &TestAmpduReception::CheckRxFailureBitmapAmpdu1, this, 0b00000111);
Simulator::Schedule (Seconds (12.1), &TestAmpduReception::CheckRxDroppedBitmapAmpdu1, this, 0b00000111);
// All MPDUs of A-MPDU 2 should have been dropped (even though TX power is higher, it is not high enough to get the PHY reception switched)
@@ -1349,18 +1337,14 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (13.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (13.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (13.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (13.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (13.0) + MicroSeconds (10), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (13.0) + MicroSeconds (10) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (13.0) + MicroSeconds (10) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (13.0) + MicroSeconds (10), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been dropped (PHY header reception failed).
// All MPDUs of A-MPDU 1 should have been received with errors (PHY header reception failed and thus incorrect decoding of payload).
Simulator::Schedule (Seconds (13.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
Simulator::Schedule (Seconds (13.1), &TestAmpduReception::CheckRxFailureBitmapAmpdu1, this, 0b00000001);
Simulator::Schedule (Seconds (13.1), &TestAmpduReception::CheckRxFailureBitmapAmpdu1, this, 0b00000111);
Simulator::Schedule (Seconds (13.1), &TestAmpduReception::CheckRxDroppedBitmapAmpdu1, this, 0b00000111);
// All MPDUs of A-MPDU 2 should have been dropped as well.
@@ -1376,14 +1360,10 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (14.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (14.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (14.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 3, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (14.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 3, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (14.0) + MicroSeconds (10), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (14.0) + MicroSeconds (10) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (14.0) + MicroSeconds (10) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (14.0) + MicroSeconds (10), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been received with errors.
Simulator::Schedule (Seconds (14.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1403,14 +1383,10 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (15.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (15.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (15.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (15.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (15.0) + MicroSeconds (10), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (15.0) + MicroSeconds (10) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (15.0) + MicroSeconds (10) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (15.0) + MicroSeconds (10), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 6, 1300);
// All MPDUs of A-MPDU 1 should have been dropped because PHY reception switched to A-MPDU 2.
Simulator::Schedule (Seconds (15.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1430,14 +1406,10 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (16.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (16.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (16.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (16.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 6, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (16.0) + MicroSeconds (10), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (16.0) + MicroSeconds (10) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (16.0) + MicroSeconds (10) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (16.0) + MicroSeconds (10), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been successfully received.
Simulator::Schedule (Seconds (16.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000111);
@@ -1457,14 +1429,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (17.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (17.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (17.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (17.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (17.0) + MicroSeconds (25), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (17.0) + MicroSeconds (25) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (17.0) + MicroSeconds (25) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (17.0) + MicroSeconds (25), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 6, 1300);
// All MPDUs of A-MPDU 1 should have been received with errors.
Simulator::Schedule (Seconds (17.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1484,14 +1452,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (18.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (18.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (18.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (18.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 6, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (18.0) + MicroSeconds (25), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (18.0) + MicroSeconds (25) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (18.0) + MicroSeconds (25) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (18.0) + MicroSeconds (25), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been successfully received.
Simulator::Schedule (Seconds (18.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000111);
@@ -1511,14 +1475,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (19.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (19.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (19.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (19.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (19.0) + MicroSeconds (25), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (19.0) + MicroSeconds (25) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (19.0) + MicroSeconds (25) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (19.0) + MicroSeconds (25), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been received with errors.
Simulator::Schedule (Seconds (19.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1538,14 +1498,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (20.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (20.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (20.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (20.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (20.0) + MicroSeconds (100), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (20.0) + MicroSeconds (100) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (20.0) + MicroSeconds (100) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (20.0) + MicroSeconds (100), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 6, 1300);
// All MPDUs of A-MPDU 1 should have been received with errors.
Simulator::Schedule (Seconds (20.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1565,14 +1521,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (21.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (21.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (21.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm + 6, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (21.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm + 6, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (21.0) + MicroSeconds (100), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (21.0) + MicroSeconds (100) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (21.0) + MicroSeconds (100) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (21.0) + MicroSeconds (100), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been successfully received.
Simulator::Schedule (Seconds (21.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000111);
@@ -1592,14 +1544,10 @@ TestAmpduReception::DoRun (void)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (22.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (22.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (22.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (22.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (22.0) + MicroSeconds (100), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (22.0) + MicroSeconds (100) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (22.0) + MicroSeconds (100) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (22.0) + MicroSeconds (100), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// All MPDUs of A-MPDU 1 should have been received with errors.
Simulator::Schedule (Seconds (22.1), &TestAmpduReception::CheckRxSuccessBitmapAmpdu1, this, 0b00000000);
@@ -1619,14 +1567,10 @@ TestAmpduReception::DoRun (void)
///////////////////////////////////////////////////////////////////////////////
// A-MPDU 1
Simulator::Schedule (Seconds (23.0), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1000, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (23.0) + NanoSeconds (1004369), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1100, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (23.0) + NanoSeconds (2055172), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1200, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (23.0), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1000);
// A-MPDU 2
Simulator::Schedule (Seconds (23.0) + NanoSeconds (1100000), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1300, WIFI_PREAMBLE_HE_SU, MPDU_IN_AGGREGATE, 2);
Simulator::Schedule (Seconds (23.0) + NanoSeconds (1100000) + NanoSeconds (1283343), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1400, WIFI_PREAMBLE_NONE, MPDU_IN_AGGREGATE, 1);
Simulator::Schedule (Seconds (23.0) + NanoSeconds (1100000) + NanoSeconds (2613120), &TestAmpduReception::ScheduleSendMpdu, this, txPowerDbm, 1500, WIFI_PREAMBLE_NONE, LAST_MPDU_IN_AGGREGATE, 0);
Simulator::Schedule (Seconds (23.0) + NanoSeconds (1100000), &TestAmpduReception::SendAmpduWithThreeMpdus, this, txPowerDbm, 1300);
// The first MPDU of A-MPDU 1 should have been successfully received (no interference).
// The two other MPDUs failed due to interference and are marked as failure (and dropped).

View File

@@ -128,7 +128,6 @@ Ptr<SpectrumSignalParameters>
WifiPhyThresholdsTest::MakeWifiSignal (double txPowerWatts)
{
WifiTxVector txVector = WifiTxVector (WifiPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, false, 1, 1, 0, 20, false, false);
MpduType mpdutype = NORMAL_MPDU;
Ptr<Packet> pkt = Create<Packet> (1000);
WifiMacHeader hdr;
@@ -137,12 +136,12 @@ WifiPhyThresholdsTest::MakeWifiSignal (double txPowerWatts)
hdr.SetType (WIFI_MAC_QOSDATA);
hdr.SetQosTid (0);
uint32_t size = pkt->GetSize () + hdr.GetSize () + trailer.GetSerializedSize ();
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency (), mpdutype, 0);
Time txDuration = m_phy->CalculateTxDuration (size, txVector, m_phy->GetFrequency ());
hdr.SetDuration (txDuration);
pkt->AddHeader (hdr);
pkt->AddTrailer (trailer);
WifiPhyTag tag (txVector, mpdutype, 1);
WifiPhyTag tag (txVector, 1);
pkt->AddPacketTag (tag);
Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, txPowerWatts, CHANNEL_WIDTH);
Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();