cleanup wifi-phy

This commit is contained in:
Sébastien Deronne
2015-06-14 17:33:42 +02:00
parent 569f1c2dce
commit ecbd57326b
3 changed files with 303 additions and 329 deletions

View File

@@ -117,31 +117,28 @@ WifiPhy::~WifiPhy ()
NS_LOG_FUNCTION (this);
}
//return the L-SIG
WifiMode
WifiPhy::GetMFPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble)
{
switch (payloadMode.GetBandwidth ())
{
case 20000000:
return WifiPhy::GetOfdmRate6_5MbpsBW20MHz ();
case 40000000:
return WifiPhy::GetOfdmRate13_5MbpsBW40MHz ();
default:
return WifiPhy::GetOfdmRate6_5MbpsBW20MHz ();
}
switch (payloadMode.GetBandwidth ())
{
case 20000000:
default:
return WifiPhy::GetOfdmRate6_5MbpsBW20MHz ();
case 40000000:
return WifiPhy::GetOfdmRate13_5MbpsBW40MHz ();
}
}
Time
WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txvector)
{
uint8_t Ndltf, Neltf;
//We suppose here that STBC = 0.
//If STBC > 0, we need a different mapping between Nss and Nltf (IEEE 802.11n-2012 standard, page 1682).
if (txvector.GetNss () < 3)
{
Ndltf = txvector.GetNss();
Ndltf = txvector.GetNss ();
}
else
{
@@ -149,7 +146,7 @@ WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector tx
}
if (txvector.GetNess () < 3)
{
Neltf = txvector.GetNess();
Neltf = txvector.GetNess ();
}
else
{
@@ -158,32 +155,29 @@ WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector tx
switch (preamble)
{
case WIFI_PREAMBLE_HT_MF:
return MicroSeconds(4 + (4 * Ndltf) + (4 * Neltf));
case WIFI_PREAMBLE_HT_GF:
return MicroSeconds((4 * Ndltf) + (4 * Neltf));
default:
// no training for non HT
return MicroSeconds(0);
case WIFI_PREAMBLE_HT_MF:
return MicroSeconds (4 + (4 * Ndltf) + (4 * Neltf));
case WIFI_PREAMBLE_HT_GF:
return MicroSeconds ((4 * Ndltf) + (4 * Neltf));
default:
//no training for non HT
return MicroSeconds (0);
}
}
//return L-SIG
Time
WifiPhy::GetPlcpHtSigHeaderDuration (WifiPreamble preamble)
{
switch (preamble)
{
case WIFI_PREAMBLE_HT_MF:
// HT-SIG
return MicroSeconds(8);
case WIFI_PREAMBLE_HT_GF:
//HT-SIG
return MicroSeconds(8);
default:
// no HT-SIG for non HT
return MicroSeconds(0);
}
switch (preamble)
{
case WIFI_PREAMBLE_HT_MF:
case WIFI_PREAMBLE_HT_GF:
//HT-SIG
return MicroSeconds (8);
default:
//no HT-SIG for non HT
return MicroSeconds (0);
}
}
WifiMode
@@ -191,81 +185,78 @@ WifiPhy::GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble)
{
switch (payloadMode.GetModulationClass ())
{
case WIFI_MOD_CLASS_OFDM:
{
switch (payloadMode.GetBandwidth ())
{
case 5000000:
return WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
case 10000000:
return WifiPhy::GetOfdmRate3MbpsBW10MHz ();
default:
// (Section 18.3.2 "PLCP frame format"; IEEE Std 802.11-2012)
// actually this is only the first part of the PlcpHeader,
// because the last 16 bits of the PlcpHeader are using the
// same mode of the payload
return WifiPhy::GetOfdmRate6Mbps ();
}
}
//Added by Ghada to support 11n
case WIFI_MOD_CLASS_HT:
{ //return the HT-SIG
// IEEE Std 802.11n, 20.3.23
switch (preamble)
{
case WIFI_PREAMBLE_HT_MF:
case WIFI_MOD_CLASS_OFDM:
{
switch (payloadMode.GetBandwidth ())
{
case 5000000:
return WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
case 10000000:
return WifiPhy::GetOfdmRate3MbpsBW10MHz ();
default:
//(Section 18.3.2 "PLCP frame format"; IEEE Std 802.11-2012)
//actually this is only the first part of the PlcpHeader,
//because the last 16 bits of the PlcpHeader are using the
//same mode of the payload
return WifiPhy::GetOfdmRate6Mbps ();
}
}
case WIFI_MOD_CLASS_HT:
{
//return the HT-SIG
//IEEE Std 802.11n, 20.3.23
switch (preamble)
{
case WIFI_PREAMBLE_HT_MF:
switch (payloadMode.GetBandwidth ())
{
case 20000000:
case 20000000:
return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
case 40000000:
case 40000000:
return WifiPhy::GetOfdmRate27MbpsBW40MHz ();
default:
default:
return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
}
case WIFI_PREAMBLE_HT_GF:
switch (payloadMode.GetBandwidth ())
case WIFI_PREAMBLE_HT_GF:
switch (payloadMode.GetBandwidth ())
{
case 20000000:
case 20000000:
return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
case 40000000:
case 40000000:
return WifiPhy::GetOfdmRate27MbpsBW40MHz ();
default:
default:
return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
}
default:
default:
return WifiPhy::GetOfdmRate6Mbps ();
}
}
}
}
case WIFI_MOD_CLASS_ERP_OFDM:
return WifiPhy::GetErpOfdmRate6Mbps ();
case WIFI_MOD_CLASS_DSSS:
if (preamble == WIFI_PREAMBLE_LONG)
{
// (Section 16.2.3 "PLCP field definitions" and Section 17.2.2.2 "Long PPDU format"; IEEE Std 802.11-2012)
//(Section 16.2.3 "PLCP field definitions" and Section 17.2.2.2 "Long PPDU format"; IEEE Std 802.11-2012)
return WifiPhy::GetDsssRate1Mbps ();
}
else // WIFI_PREAMBLE_SHORT
else //WIFI_PREAMBLE_SHORT
{
// (Section 17.2.2.3 "Short PPDU format"; IEEE Std 802.11-2012)
//(Section 17.2.2.3 "Short PPDU format"; IEEE Std 802.11-2012)
return WifiPhy::GetDsssRate2Mbps ();
}
default:
NS_FATAL_ERROR ("unsupported modulation class");
return WifiMode ();
}
}
Time
WifiPhy::GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble)
{
if (preamble == WIFI_PREAMBLE_NONE)
{
{
return MicroSeconds(0);
}
}
switch (payloadMode.GetModulationClass ())
{
case WIFI_MOD_CLASS_OFDM:
@@ -274,55 +265,50 @@ WifiPhy::GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble)
{
case 20000000:
default:
// (Section 18.3.3 "PLCP preamble (SYNC))" and Figure 18-4 "OFDM training structure"; IEEE Std 802.11-2012)
// also (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
// We return the duration of the SIGNAL field only, since the
// SERVICE field (which strictly speaking belongs to the PLCP
// header, see Section 18.3.2 and Figure 18-1) is sent using the
// payload mode.
return MicroSeconds(4);
//(Section 18.3.3 "PLCP preamble (SYNC))" and Figure 18-4 "OFDM training structure"; IEEE Std 802.11-2012)
//also (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
//We return the duration of the SIGNAL field only, since the
//SERVICE field (which strictly speaking belongs to the PLCP
//header, see Section 18.3.2 and Figure 18-1) is sent using the
//payload mode.
return MicroSeconds (4);
case 10000000:
// (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
return MicroSeconds(8);
//(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
return MicroSeconds (8);
case 5000000:
// (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
return MicroSeconds(16);
//(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
return MicroSeconds (16);
}
}
//Added by Ghada to support 11n
case WIFI_MOD_CLASS_HT:
{ //IEEE 802.11n Figure 20.1
switch (preamble)
{
case WIFI_PREAMBLE_HT_MF:
// L-SIG
return MicroSeconds(4);
case WIFI_PREAMBLE_HT_GF:
//L-SIG
return MicroSeconds(0);
default:
// L-SIG
return MicroSeconds(4);
}
{
//L-SIG
//IEEE 802.11n Figure 20.1
switch (preamble)
{
case WIFI_PREAMBLE_HT_MF:
default:
return MicroSeconds (4);
case WIFI_PREAMBLE_HT_GF:
return MicroSeconds (0);
}
}
case WIFI_MOD_CLASS_ERP_OFDM:
return MicroSeconds(4);
return MicroSeconds (4);
case WIFI_MOD_CLASS_DSSS:
if (preamble == WIFI_PREAMBLE_SHORT)
{
// (Section 17.2.2.3 "Short PPDU format" and Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds(24);
//(Section 17.2.2.3 "Short PPDU format" and Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds (24);
}
else // WIFI_PREAMBLE_LONG
else //WIFI_PREAMBLE_LONG
{
// (Section 17.2.2.2 "Long PPDU format" and Figure 17-1 "Short PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds(48);
//(Section 17.2.2.2 "Long PPDU format" and Figure 17-1 "Short PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds (48);
}
default:
NS_FATAL_ERROR ("unsupported modulation class");
return MicroSeconds(0);
return MicroSeconds (0);
}
}
@@ -330,95 +316,91 @@ Time
WifiPhy::GetPlcpPreambleDuration (WifiMode payloadMode, WifiPreamble preamble)
{
if (preamble == WIFI_PREAMBLE_NONE)
{
return MicroSeconds(0);
}
{
return MicroSeconds (0);
}
switch (payloadMode.GetModulationClass ())
{
case WIFI_MOD_CLASS_OFDM:
{
switch (payloadMode.GetBandwidth ())
{
case 20000000:
default:
// (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
// also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
return MicroSeconds(16);
case 10000000:
// (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
// also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
return MicroSeconds(32);
case 5000000:
// (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
// also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
return MicroSeconds(64);
}
}
case WIFI_MOD_CLASS_HT:
{
case WIFI_MOD_CLASS_OFDM:
{
switch (payloadMode.GetBandwidth ())
{
case 20000000:
default:
//(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
//also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
return MicroSeconds (16);
case 10000000:
//(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
//also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
return MicroSeconds (32);
case 5000000:
//(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
//also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
return MicroSeconds (64);
}
}
case WIFI_MOD_CLASS_HT:
//IEEE 802.11n Figure 20.1 the training symbols before L_SIG or HT_SIG
return MicroSeconds(16);
}
case WIFI_MOD_CLASS_ERP_OFDM:
return MicroSeconds(16);
case WIFI_MOD_CLASS_DSSS:
if (preamble == WIFI_PREAMBLE_SHORT)
{
// (Section 17.2.2.3 "Short PPDU format)" Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds(72);
}
else // WIFI_PREAMBLE_LONG
{
// (Section 17.2.2.2 "Long PPDU format)" Figure 17-1 "Long PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds(144);
}
default:
NS_FATAL_ERROR ("unsupported modulation class");
return MicroSeconds(0);
return MicroSeconds (16);
case WIFI_MOD_CLASS_ERP_OFDM:
return MicroSeconds (16);
case WIFI_MOD_CLASS_DSSS:
if (preamble == WIFI_PREAMBLE_SHORT)
{
//(Section 17.2.2.3 "Short PPDU format)" Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds (72);
}
else //WIFI_PREAMBLE_LONG
{
//(Section 17.2.2.2 "Long PPDU format)" Figure 17-1 "Long PPDU format"; IEEE Std 802.11-2012)
return MicroSeconds (144);
}
default:
NS_FATAL_ERROR ("unsupported modulation class");
return MicroSeconds (0);
}
}
Time
WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
{
WifiMode payloadMode = txvector.GetMode();
WifiMode payloadMode = txvector.GetMode ();
NS_LOG_FUNCTION (size << payloadMode);
switch (payloadMode.GetModulationClass ())
{
case WIFI_MOD_CLASS_OFDM:
case WIFI_MOD_CLASS_ERP_OFDM:
{
// (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012
// corresponds to T_{SYM} in the table)
Time symbolDuration;
switch (payloadMode.GetBandwidth ())
{
case 20000000:
default:
symbolDuration = MicroSeconds(4);
break;
case 10000000:
symbolDuration = MicroSeconds(8);
break;
case 5000000:
symbolDuration = MicroSeconds(16);
break;
case WIFI_MOD_CLASS_OFDM:
case WIFI_MOD_CLASS_ERP_OFDM:
{
//(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012
//corresponds to T_{SYM} in the table)
Time symbolDuration;
switch (payloadMode.GetBandwidth ())
{
case 20000000:
default:
symbolDuration = MicroSeconds (4);
break;
case 10000000:
symbolDuration = MicroSeconds (8);
break;
case 5000000:
symbolDuration = MicroSeconds (16);
break;
}
// (Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
// corresponds to N_{DBPS} in the table
double numDataBitsPerSymbol = payloadMode.GetDataRate () * symbolDuration.GetNanoSeconds() / 1e9;
//(Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
//corresponds to N_{DBPS} in the table
double numDataBitsPerSymbol = payloadMode.GetDataRate () * symbolDuration.GetNanoSeconds () / 1e9;
// (Section 18.3.5.4 "Pad bits (PAD)" Equation 18-11; IEEE Std 802.11-2012)
//(Section 18.3.5.4 "Pad bits (PAD)" Equation 18-11; IEEE Std 802.11-2012)
uint32_t numSymbols;
if (packetType == 1 && preamble != WIFI_PREAMBLE_NONE)
{
//First packet in an A-MPDU
numSymbols= ceil((16 + size * 8.0 + 6) / (numDataBitsPerSymbol));
numSymbols = ceil ((16 + size * 8.0 + 6) / numDataBitsPerSymbol);
if (incFlag == 1)
{
m_totalAmpduSize += size;
@@ -428,7 +410,7 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
else if (packetType == 1 && preamble == WIFI_PREAMBLE_NONE)
{
//consecutive packets in an A-MPDU
numSymbols= ((size * 8.0) / (numDataBitsPerSymbol));
numSymbols = ((size * 8.0) / numDataBitsPerSymbol);
if (incFlag == 1)
{
m_totalAmpduSize += size;
@@ -439,7 +421,7 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
{
//last packet in an A-MPDU
uint32_t totalAmpduSize = m_totalAmpduSize + size;
numSymbols = lrint (ceil((16 + totalAmpduSize * 8.0 + 6) / (numDataBitsPerSymbol)));
numSymbols = lrint (ceil ((16 + totalAmpduSize * 8.0 + 6) / numDataBitsPerSymbol));
numSymbols -= m_totalAmpduNumSymbols;
if (incFlag == 1)
{
@@ -450,15 +432,15 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
else if (packetType == 0 && preamble != WIFI_PREAMBLE_NONE)
{
//Not an A-MPDU
numSymbols = lrint (ceil ((16 + size * 8.0 + 6.0) / (numDataBitsPerSymbol)));
numSymbols = lrint (ceil ((16 + size * 8.0 + 6.0) / numDataBitsPerSymbol));
}
else
NS_FATAL_ERROR ("Wrong combination of preamble and packet type");
// Add signal extension for ERP PHY
//Add signal extension for ERP PHY
if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
{
return Time (numSymbols * symbolDuration) + MicroSeconds(6);
return Time (numSymbols * symbolDuration) + MicroSeconds (6);
}
else
{
@@ -467,51 +449,56 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
}
case WIFI_MOD_CLASS_HT:
{
Time symbolDuration;
double m_Stbc;
Time symbolDuration;
double m_Stbc;
//if short GI data rate is used then symbol duration is 3.6us else symbol duration is 4us
//In the future has to create a stationmanager that only uses these data rates if sender and reciever support GI
if (payloadMode.GetUniqueName() == "OfdmRate135MbpsBW40MHzShGi" || payloadMode.GetUniqueName() == "OfdmRate65MbpsBW20MHzShGi" )
{
symbolDuration = NanoSeconds(3600);
}
else
{
switch (payloadMode.GetDataRate ()/ (txvector.GetNss()))
{ //shortGi
case 7200000:
case 14400000:
case 21700000:
case 28900000:
case 43300000:
case 57800000:
case 72200000:
case 15000000:
case 30000000:
case 45000000:
case 60000000:
case 90000000:
case 120000000:
case 150000000:
symbolDuration = NanoSeconds(3600);
break;
default:
symbolDuration = MicroSeconds(4);
if (payloadMode.GetUniqueName () == "OfdmRate135MbpsBW40MHzShGi" || payloadMode.GetUniqueName () == "OfdmRate65MbpsBW20MHzShGi" )
{
symbolDuration = NanoSeconds (3600);
}
else
{
switch (payloadMode.GetDataRate () / (txvector.GetNss ()))
{
//shortGi
case 7200000:
case 14400000:
case 21700000:
case 28900000:
case 43300000:
case 57800000:
case 72200000:
case 15000000:
case 30000000:
case 45000000:
case 60000000:
case 90000000:
case 120000000:
case 150000000:
symbolDuration = NanoSeconds (3600);
break;
default:
symbolDuration = MicroSeconds (4);
}
}
if (txvector.IsStbc())
m_Stbc=2;
else
m_Stbc=1;
double numDataBitsPerSymbol = payloadMode.GetDataRate () * txvector.GetNss() * symbolDuration.GetNanoSeconds() / 1e9;
//check tables 20-35 and 20-36 in the standard to get cases when nes =2
double Nes=1;
// IEEE Std 802.11n, section 20.3.11, equation (20-32)
}
if (txvector.IsStbc ())
m_Stbc = 2;
else
m_Stbc = 1;
//check tables 20-35 and 20-36 in the standard to get cases when nes =2
double Nes = 1;
//IEEE Std 802.11n, section 20.3.11, equation (20-32)
uint32_t numSymbols;
double numDataBitsPerSymbol = payloadMode.GetDataRate () * txvector.GetNss () * symbolDuration.GetNanoSeconds () / 1e9;
if (packetType == 1 && preamble != WIFI_PREAMBLE_NONE)
{
//First packet in an A-MPDU
numSymbols = ceil(m_Stbc*(16 + size * 8.0 + 6*Nes) / (m_Stbc* numDataBitsPerSymbol));
numSymbols = ceil (m_Stbc * (16 + size * 8.0 + 6 * Nes) / (m_Stbc * numDataBitsPerSymbol));
if (incFlag == 1)
{
m_totalAmpduSize += size;
@@ -521,7 +508,7 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
else if (packetType == 1 && preamble == WIFI_PREAMBLE_NONE)
{
//consecutive packets in an A-MPDU
numSymbols = m_Stbc* ((size * 8.0 ) / (m_Stbc* numDataBitsPerSymbol));
numSymbols = m_Stbc * ((size * 8.0 ) / (m_Stbc * numDataBitsPerSymbol));
if (incFlag == 1)
{
m_totalAmpduSize += size;
@@ -531,8 +518,8 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
else if (packetType == 2 && preamble == WIFI_PREAMBLE_NONE)
{
//last packet in an A-MPDU
uint32_t totalAmpduSize = m_totalAmpduSize+size;
numSymbols = lrint (m_Stbc* ceil((16 + totalAmpduSize * 8.0 + 6*Nes) / (m_Stbc* numDataBitsPerSymbol)));
uint32_t totalAmpduSize = m_totalAmpduSize + size;
numSymbols = lrint (m_Stbc * ceil ((16 + totalAmpduSize * 8.0 + 6 * Nes) / (m_Stbc * numDataBitsPerSymbol)));
NS_ASSERT (m_totalAmpduNumSymbols <= numSymbols);
numSymbols -= m_totalAmpduNumSymbols;
if (incFlag == 1)
@@ -542,30 +529,28 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
}
}
else if (packetType == 0 && preamble != WIFI_PREAMBLE_NONE)
//Not an A-MPDU
{
numSymbols = lrint (m_Stbc*ceil ((16 + size * 8.0 + 6.0*Nes) / (m_Stbc* numDataBitsPerSymbol)));
//Not an A-MPDU
numSymbols = lrint (m_Stbc * ceil ((16 + size * 8.0 + 6.0 * Nes) / (m_Stbc * numDataBitsPerSymbol)));
}
else
NS_FATAL_ERROR ("Wrong combination of preamble and packet type");
if (frequency >= 2400 && frequency <= 2500 && ((packetType == 0 && preamble != WIFI_PREAMBLE_NONE) || (packetType == 2 && preamble == WIFI_PREAMBLE_NONE))) //at 2.4 GHz
{
return Time (numSymbols * symbolDuration) + MicroSeconds(6);
return Time (numSymbols * symbolDuration) + MicroSeconds (6);
}
else //at 5 GHz
else //at 5 GHz
{
return Time (numSymbols * symbolDuration);
}
}
case WIFI_MOD_CLASS_DSSS:
// (Section 17.2.3.6 "Long PLCP LENGTH field"; IEEE Std 802.11-2012)
//(Section 17.2.3.6 "Long PLCP LENGTH field"; IEEE Std 802.11-2012)
NS_LOG_LOGIC (" size=" << size
<< " mode=" << payloadMode
<< " rate=" << payloadMode.GetDataRate () );
<< " rate=" << payloadMode.GetDataRate ());
return MicroSeconds (lrint (ceil ((size * 8.0) / (payloadMode.GetDataRate () / 1.0e6))));
default:
NS_FATAL_ERROR ("unsupported modulation class");
return MicroSeconds (0);
@@ -573,24 +558,21 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble
}
Time
WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
WifiPhy::CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txvector, WifiPreamble preamble)
{
WifiMode payloadMode=txvector.GetMode();
WifiMode payloadMode = txvector.GetMode ();
Time duration = GetPlcpPreambleDuration (payloadMode, preamble)
+ GetPlcpHeaderDuration (payloadMode, preamble)
+ GetPlcpHtSigHeaderDuration (preamble)
+ GetPlcpHtTrainingSymbolDuration (preamble, txvector)
+ GetPayloadDuration (size, txvector, preamble, frequency, packetType, incFlag);
+ GetPlcpHeaderDuration (payloadMode, preamble)
+ GetPlcpHtSigHeaderDuration (preamble)
+ GetPlcpHtTrainingSymbolDuration (preamble, txvector);
return duration;
}
Time
WifiPhy::CalculatePlcpDuration (WifiTxVector txvector, WifiPreamble preamble)
WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
{
WifiMode payloadMode=txvector.GetMode();
Time duration = GetPlcpPreambleDuration (payloadMode, preamble)
+ GetPlcpHeaderDuration (payloadMode, preamble)
+ GetPlcpHtSigHeaderDuration (preamble)
+ GetPlcpHtTrainingSymbolDuration (preamble, txvector);
Time duration = CalculatePlcpPreambleAndHeaderDuration (txvector, preamble)
+ GetPayloadDuration (size, txvector, preamble, frequency, packetType, incFlag);
return duration;
}
@@ -914,6 +896,7 @@ WifiPhy::GetOfdmRate54Mbps ()
return mode;
}
// 10 MHz channel rates
WifiMode
@@ -1020,6 +1003,7 @@ WifiPhy::GetOfdmRate27MbpsBW10MHz ()
return mode;
}
// 5 MHz channel rates
WifiMode
@@ -1126,6 +1110,7 @@ WifiPhy::GetOfdmRate13_5MbpsBW5MHz ()
return mode;
}
// Clause 20
WifiMode
@@ -1140,6 +1125,7 @@ WifiPhy::GetOfdmRate6_5MbpsBW20MHz ()
2);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate7_2MbpsBW20MHz ()
{
@@ -1178,6 +1164,7 @@ WifiPhy::GetOfdmRate14_4MbpsBW20MHz ()
4);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate19_5MbpsBW20MHz ()
{
@@ -1204,7 +1191,6 @@ WifiPhy::GetOfdmRate21_7MbpsBW20MHz ()
return mode;
}
WifiMode
WifiPhy::GetOfdmRate26MbpsBW20MHz ()
{
@@ -1283,7 +1269,6 @@ WifiPhy::GetOfdmRate57_8MbpsBW20MHz ()
return mode;
}
WifiMode
WifiPhy::GetOfdmRate58_5MbpsBW20MHz ()
{
@@ -1374,6 +1359,7 @@ WifiPhy::GetOfdmRate27MbpsBW40MHz ()
4);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate30MbpsBW40MHz ()
{
@@ -1399,6 +1385,7 @@ WifiPhy::GetOfdmRate40_5MbpsBW40MHz ()
4);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate45MbpsBW40MHz ()
{
@@ -1450,6 +1437,7 @@ WifiPhy::GetOfdmRate81MbpsBW40MHz ()
16);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate90MbpsBW40MHz ()
{
@@ -1475,6 +1463,7 @@ WifiPhy::GetOfdmRate108MbpsBW40MHz ()
64);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate120MbpsBW40MHz ()
{
@@ -1487,6 +1476,7 @@ WifiPhy::GetOfdmRate120MbpsBW40MHz ()
64);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate121_5MbpsBW40MHz ()
{
@@ -1499,6 +1489,7 @@ WifiPhy::GetOfdmRate121_5MbpsBW40MHz ()
64);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate135MbpsBW40MHzShGi ()
{
@@ -1511,6 +1502,7 @@ WifiPhy::GetOfdmRate135MbpsBW40MHzShGi ()
64);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate135MbpsBW40MHz ()
{
@@ -1538,7 +1530,6 @@ WifiPhy::GetOfdmRate150MbpsBW40MHz ()
}
std::ostream& operator<< (std::ostream& os, enum WifiPhy::State state)
{
switch (state)
@@ -1561,8 +1552,6 @@ std::ostream& operator<< (std::ostream& os, enum WifiPhy::State state)
}
}
} // namespace ns3
namespace {
@@ -1642,4 +1631,5 @@ public:
ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz ();
}
} g_constructor;
}

View File

@@ -82,7 +82,6 @@ public:
* unless they have received a cca busy report.
*/
virtual void NotifyTxStart (Time duration, double txPowerDbm) = 0;
/**
* \param duration the expected busy duration.
*
@@ -163,12 +162,12 @@ public:
* arg3: TXVECTOR of packet
* arg4: type of preamble used for packet.
*/
typedef Callback<void,Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> RxOkCallback;
typedef Callback<void, Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> RxOkCallback;
/**
* arg1: packet received unsuccessfully
* arg2: snr of packet
*/
typedef Callback<void,Ptr<const Packet>, double> RxErrorCallback;
typedef Callback<void, Ptr<const Packet>, double> RxErrorCallback;
static TypeId GetTypeId (void);
@@ -289,24 +288,25 @@ public:
* \param txvector the transmission parameters used for this packet
* \param preamble the type of preamble to use for this packet.
* \param frequency the channel center frequency (MHz)
* \param packetType 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
* \param packetType 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
* \param incFlag this flag is used to indicate that the static variables need to be update or not. This function is called a couple of times for the same packet so static variables should not be increased each time.
* \return the total amount of time this PHY will stay busy for
* the transmission of these bytes.
*
* \return the total amount of time this PHY will stay busy for the transmission of these bytes.
*/
Time CalculateTxDuration (uint32_t size, WifiTxVector txvector, enum WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag);
/**
* \param txvector the transmission parameters used for this packet
* \param preamble the type of preamble to use for this packet.
* \return the total amount of time this PHY will stay busy for the transmission of the plcp.
*
* \return the total amount of time this PHY will stay busy for the transmission of the PLCP preamble and PLCP header.
*/
Time CalculatePlcpDuration (WifiTxVector txvector, enum WifiPreamble preamble);
Time CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txvector, enum WifiPreamble preamble);
/**
* \param preamble the type of preamble
* \param txvector the transmission parameters used for this packet
*
* \return the training symbol duration
*/
static Time GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txvector);
@@ -323,8 +323,6 @@ public:
* \return the duration of the HT-SIG in Mixed Format and greenfield format PLCP header
*/
static Time GetPlcpHtSigHeaderDuration (WifiPreamble preamble);
/**
* \param payloadMode the WifiMode use for the transmission of the payload
* \param preamble the type of preamble
@@ -332,7 +330,6 @@ public:
* \return the WifiMode used for the transmission of the PLCP header
*/
static WifiMode GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble);
/**
* \param payloadMode the WifiMode use for the transmission of the payload
* \param preamble the type of preamble
@@ -340,7 +337,6 @@ public:
* \return the duration of the PLCP header
*/
static Time GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble);
/**
* \param payloadMode the WifiMode use for the transmission of the payload
* \param preamble the type of preamble
@@ -348,13 +344,12 @@ public:
* \return the duration of the PLCP preamble
*/
static Time GetPlcpPreambleDuration (WifiMode payloadMode, WifiPreamble preamble);
/**
* \param size the number of bytes in the packet to send
* \param txvector the transmission parameters used for this packet
* \param preamble the type of preamble to use for this packet.
* \param preamble the type of preamble to use for this packet
* \param frequency the channel center frequency (MHz)
* \param packetType 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
* \param packetType 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)
* \param incFlag this flag is used to indicate that the static variables need to be update or not. This function is called a couple of times for the same packet so static variables should not be increased each time
*
* \return the duration of the payload
@@ -393,6 +388,7 @@ public:
* necessarily proper) of the BSSBasicRateSet.
*
* \param mode index in array of supported modes
*
* \return the mode whose index is specified.
*
* \sa WifiPhy::GetNModes()
@@ -402,17 +398,21 @@ public:
* Check if the given WifiMode is supported by the PHY.
*
* \param mode the wifi mode to check
*
* \return true if the given mode is supported,
* false otherwise
*/
virtual bool IsModeSupported (WifiMode mode) const = 0;
/**
* \param txMode the transmission mode
* \param ber the probability of bit error rate
*
* \return the minimum snr which is required to achieve
* the requested ber for the specified transmission mode. (W/W)
*/
virtual double CalculateSnr (WifiMode txMode, double ber) const = 0;
/**
* The WifiPhy::NBssMembershipSelectors() method is used
* (e.g., by a WifiRemoteStationManager) to determine the set of
@@ -420,12 +420,9 @@ public:
* can support - a set of WifiMode objects which we call the
* BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
*
* This was introduced with 11n
*
* \return the memebership selector whose index is specified.
*/
virtual uint32_t GetNBssMembershipSelectors (void) const=0;
virtual uint32_t GetNBssMembershipSelectors (void) const = 0;
/**
* The WifiPhy::BssMembershipSelector() method is used
* (e.g., by a WifiRemoteStationManager) to determine the set of
@@ -433,12 +430,11 @@ public:
* can support - a set of WifiMode objects which we call the
* BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
*
* This was introduced with 11n
*
* \param selector index in array of supported memberships
*
* \return the memebership selector whose index is specified.
*/
virtual uint32_t GetBssMembershipSelector (uint32_t selector) const=0;
virtual uint32_t GetBssMembershipSelector (uint32_t selector) const = 0;
/**
* The WifiPhy::GetMembershipSelectorModes() method is used
* (e.g., by a WifiRemoteStationManager) to determine the set of
@@ -446,14 +442,13 @@ public:
* can support - a set of WifiMode objects which we call the
* BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
*
* This was introduced with 11n
*
* \param selector index in array of supported memberships
*
* \return a WifiModeList that contains the WifiModes associrated with the selected index.
*
* \sa WifiPhy::GetMembershipSelectorModes()
*/
virtual WifiModeList GetMembershipSelectorModes(uint32_t selector)=0;
virtual WifiModeList GetMembershipSelectorModes(uint32_t selector) = 0;
/**
* The WifiPhy::GetNMcs() method is used
* (e.g., by a WifiRemoteStationManager) to determine the set of
@@ -461,8 +456,6 @@ public:
* can support - a set of MCS indexes which we call the
* DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet.
*
* This was introduced with 11n
*
* \return the MCS index whose index is specified.
*/
virtual uint8_t GetNMcs (void) const=0;
@@ -473,31 +466,31 @@ public:
* can support - a set of MCS indexes which we call the
* DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet.
*
* This was introduced with 11n
*
* \param mcs index in array of supported MCS
*
* \return the MCS index whose index is specified.
*/
virtual uint8_t GetMcs (uint8_t mcs) const=0;
virtual uint8_t GetMcs (uint8_t mcs) const = 0;
/**
* For a given WifiMode finds the corresponding MCS value and returns it
* as defined in the IEEE 802.11n standard
*
* \param mode the WifiMode
*
* \return the MCS number that corresponds to the given WifiMode
*/
virtual uint32_t WifiModeToMcs (WifiMode mode)=0;
virtual uint32_t WifiModeToMcs (WifiMode mode) = 0;
/**
* For a given MCS finds the corresponding WifiMode and returns it
* as defined in the IEEE 802.11n standard.
*
* \param mcs the MCS number
*
* \return the WifiMode that corresponds to the given MCS number
*/
virtual WifiMode McsToWifiMode (uint8_t mcs)=0;
virtual WifiMode McsToWifiMode (uint8_t mcs) = 0;
/**
* \brief Set channel number.
*
@@ -846,7 +839,6 @@ public:
* \return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing
*/
static WifiMode GetOfdmRate135MbpsBW40MHz ();
//Rates for clause 20 with short guard interval
/**
* Return a WifiMode for OFDM at 7.2Mbps with 20MHz channel spacing.
*
@@ -946,58 +938,52 @@ public:
*/
static WifiMode GetOfdmRate150MbpsBW40MHz ();
/**
* Public method used to fire a PhyTxBegin trace. Implemented for encapsulation
* purposes.
* Public method used to fire a PhyTxBegin trace.
* Implemented for encapsulation purposes.
*
* \param packet the packet being transmitted
*/
void NotifyTxBegin (Ptr<const Packet> packet);
/**
* Public method used to fire a PhyTxEnd trace. Implemented for encapsulation
* purposes.
* Public method used to fire a PhyTxEnd trace.
* Implemented for encapsulation purposes.
*
* \param packet the packet that was transmitted
*/
void NotifyTxEnd (Ptr<const Packet> packet);
/**
* Public method used to fire a PhyTxDrop trace. Implemented for encapsulation
* purposes.
* Public method used to fire a PhyTxDrop trace.
* Implemented for encapsulation purposes.
*
* \param packet the packet that was failed to transmitted
*/
void NotifyTxDrop (Ptr<const Packet> packet);
/**
* Public method used to fire a PhyRxBegin trace. Implemented for encapsulation
* purposes.
* Public method used to fire a PhyRxBegin trace.
* Implemented for encapsulation purposes.
*
* \param packet the packet being received
*/
void NotifyRxBegin (Ptr<const Packet> packet);
/**
* Public method used to fire a PhyRxEnd trace. Implemented for encapsulation
* purposes.
* Public method used to fire a PhyRxEnd trace.
* Implemented for encapsulation purposes.
*
* \param packet the packet received
*/
void NotifyRxEnd (Ptr<const Packet> packet);
/**
* Public method used to fire a PhyRxDrop trace. Implemented for encapsulation
* purposes.
* Public method used to fire a PhyRxDrop trace.
* Implemented for encapsulation purposes.
*
* \param packet the packet that was not successfully received
*/
void NotifyRxDrop (Ptr<const Packet> packet);
/**
* Public method used to fire a MonitorSniffer trace for a wifi packet
* being received. Implemented for encapsulation purposes.
* Public method used to fire a MonitorSniffer trace for a wifi packet being received.
* Implemented for encapsulation purposes.
*
* \param packet the packet being received
* \param channelFreqMhz the frequency in MHz at which the packet is
@@ -1038,7 +1024,7 @@ public:
* \param isShortPreamble true if short preamble is used, false otherwise
* \param txVector the txvector that holds rx parameters
* \param signalDbm signal power in dBm
* \param noiseDbm noise power in dBm
* \param noiseDbm noise power in dBm
*/
typedef void (* MonitorSnifferRxCallback)
(Ptr<const Packet> packet, uint16_t channelFreqMhz,
@@ -1047,8 +1033,8 @@ public:
double signalDbm, double noiseDbm);
/**
* Public method used to fire a MonitorSniffer trace for a wifi packet
* being transmitted. Implemented for encapsulation purposes.
* Public method used to fire a MonitorSniffer trace for a wifi packet being transmitted.
* Implemented for encapsulation purposes.
*
* \param packet the packet being transmitted
* \param channelFreqMhz the frequency in MHz at which the packet is
@@ -1080,10 +1066,9 @@ public:
uint16_t channelNumber, uint32_t rate,
bool isShortPreamble, WifiTxVector txvector);
/**
* Assign a fixed random variable stream number to the random variables
* used by this model. Return the number of streams (possibly zero) that
* used by this model. Return the number of streams (possibly zero) that
* have been assigned.
*
* \param stream first stream index to use
@@ -1094,69 +1079,68 @@ public:
/**
* \param freq the operating frequency on this node.
*/
virtual void SetFrequency (uint32_t freq)=0;
virtual void SetFrequency (uint32_t freq) = 0;
/**
* \return the operating frequency on this node
*/
virtual uint32_t GetFrequency (void) const=0;
virtual uint32_t GetFrequency (void) const = 0;
/**
* \param tx the number of transmitters on this node.
*/
virtual void SetNumberOfTransmitAntennas (uint32_t tx)=0;
virtual void SetNumberOfTransmitAntennas (uint32_t tx) = 0;
/**
* \return the number of transmit antenna on this device
*/
virtual uint32_t GetNumberOfTransmitAntennas (void) const=0;
virtual uint32_t GetNumberOfTransmitAntennas (void) const = 0;
/**
* \param rx the number of receivers on this node.
*/
virtual void SetNumberOfReceiveAntennas (uint32_t rx)=0 ;
virtual void SetNumberOfReceiveAntennas (uint32_t rx) = 0;
/**
* \return the number of receivers on this node.
*/
virtual uint32_t GetNumberOfReceiveAntennas (void) const=0;
virtual uint32_t GetNumberOfReceiveAntennas (void) const = 0;
/**
* \param guardInterval Enable or disable short guard interval
*/
virtual void SetGuardInterval (bool guardInterval)=0;
/**
* \return true if short guard interval is supported, false otherwise
virtual void SetGuardInterval (bool guardInterval) = 0;
/**
* \return true if short guard interval is supported, false otherwise
*/
virtual bool GetGuardInterval (void) const = 0;
/**
* \param ldpc Enable or disable LDPC
*/
virtual void SetLdpc (bool ldpc)=0;
virtual void SetLdpc (bool ldpc) = 0;
/**
* \return true if LDPC is supported, false otherwise
*/
virtual bool GetLdpc (void) const=0;
virtual bool GetLdpc (void) const = 0;
/**
* \param stbc Enable or disable STBC is supported
*/
virtual void SetStbc (bool stbc)=0;
virtual void SetStbc (bool stbc) = 0;
/**
* \return true if STBC is supported, false otherwise
* \return true if STBC is supported, false otherwise
*/
virtual bool GetStbc (void) const=0;
virtual bool GetStbc (void) const = 0;
/**
* \param greenfield Enable or disable GreenField
*/
virtual void SetGreenfield (bool greenfield)=0;
virtual void SetGreenfield (bool greenfield) = 0;
/**
* \return true if Greenfield is supported, false otherwise
*/
virtual bool GetGreenfield (void) const=0;
virtual bool GetGreenfield (void) const = 0;
/**
* \return true if channel bonding 40 MHz is supported, false otherwise
*/
virtual bool GetChannelBonding (void) const = 0;
/**
* \param channelbonding Enable or disable channel bonding
* \param channelbonding Enable or disable channel bonding
*/
virtual void SetChannelBonding (bool channelbonding) = 0 ;
virtual void SetChannelBonding (bool channelbonding) = 0;
private:
/**

View File

@@ -533,7 +533,7 @@ YansWifiPhy::StartReceivePlcp (Ptr<Packet> packet,
rxPowerDbm += m_rxGainDb;
double rxPowerW = DbmToW (rxPowerDbm);
Time endRx = Simulator::Now () + rxDuration;
Time plcpDuration = CalculatePlcpDuration (txVector, preamble);
Time plcpDuration = CalculatePlcpPreambleAndHeaderDuration (txVector, preamble);
Ptr<InterferenceHelper::Event> event;
event = m_interference.Add (packet->GetSize (),