diff --git a/src/wifi/examples/test-interference-helper.cc b/src/wifi/examples/test-interference-helper.cc index 6cf1d6d4f..167ac6a03 100644 --- a/src/wifi/examples/test-interference-helper.cc +++ b/src/wifi/examples/test-interference-helper.cc @@ -323,9 +323,9 @@ int main (int argc, char *argv[]) { input.preamble = WIFI_PREAMBLE_HT_GF; } - else if (str_preamble == "WIFI_PREAMBLE_VHT" && input.standard == WIFI_PHY_STANDARD_80211ac) + else if (str_preamble == "WIFI_PREAMBLE_VHT_SU" && input.standard == WIFI_PHY_STANDARD_80211ac) { - input.preamble = WIFI_PREAMBLE_VHT; + input.preamble = WIFI_PREAMBLE_VHT_SU; } else { diff --git a/src/wifi/model/interference-helper.cc b/src/wifi/model/interference-helper.cc index f4f8255a0..fd495a067 100644 --- a/src/wifi/model/interference-helper.cc +++ b/src/wifi/model/interference-helper.cc @@ -492,12 +492,12 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh //mode for PLCP header fields sent with HT modulation mcsHeaderMode = WifiPhy::GetHtPlcpHeaderMode (); } - else if (preamble == WIFI_PREAMBLE_VHT) + else if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_VHT_MU) { //mode for PLCP header fields sent with VHT modulation mcsHeaderMode = WifiPhy::GetVhtPlcpHeaderMode (); } - else if (preamble == WIFI_PREAMBLE_HE_SU) + else if (preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_HE_MU) { //mode for PLCP header fields sent with HE modulation mcsHeaderMode = WifiPhy::GetHePlcpHeaderMode (); @@ -558,7 +558,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh plcpPayloadStart - plcpTrainingSymbolsStart, mcsHeaderMode, txVector); //Case 3ai: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { //SIG-A is sent using legacy OFDM modulation psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, @@ -588,7 +588,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh current - plcpTrainingSymbolsStart, mcsHeaderMode, txVector); //Case 3bi: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { //SIG-A is sent using legacy OFDM modulation psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, @@ -613,7 +613,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh else { //Case 3ci: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { //SIG-A is sent using legacy OFDM modulation psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, @@ -649,7 +649,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh NS_LOG_DEBUG ("Case 4ai - previous in L-SIG and current after payload start: nothing to do"); } //Case 4aii: VHT or HE format - else if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + else if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, @@ -679,7 +679,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 4bi: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, @@ -709,7 +709,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 4ci: VHT format - if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, @@ -749,7 +749,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh NS_LOG_DEBUG ("Case 5ai - previous is in the preamble and current is after payload start: nothing to do"); } //Case 5aii: VHT or HE format - else if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + else if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, @@ -779,7 +779,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 5bi: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, @@ -809,7 +809,7 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr event, NiCh { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 5ci: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT || preamble == WIFI_PREAMBLE_HE_SU) + if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, diff --git a/src/wifi/model/wifi-phy.cc b/src/wifi/model/wifi-phy.cc index e904b448e..3031427a1 100644 --- a/src/wifi/model/wifi-phy.cc +++ b/src/wifi/model/wifi-phy.cc @@ -1799,9 +1799,11 @@ WifiPhy::GetPlcpTrainingSymbolDuration (WifiTxVector txVector) return MicroSeconds (4 + (4 * Ndltf) + (4 * Neltf)); case WIFI_PREAMBLE_HT_GF: return MicroSeconds ((4 * Ndltf) + (4 * Neltf)); - case WIFI_PREAMBLE_VHT: + case WIFI_PREAMBLE_VHT_SU: + case WIFI_PREAMBLE_VHT_MU: return MicroSeconds (4 + (4 * Ndltf)); case WIFI_PREAMBLE_HE_SU: + case WIFI_PREAMBLE_HE_MU: return MicroSeconds (4 + (8 * Ndltf)); default: return MicroSeconds (0); @@ -1828,8 +1830,10 @@ WifiPhy::GetPlcpSigA1Duration (WifiPreamble preamble) { switch (preamble) { - case WIFI_PREAMBLE_VHT: + case WIFI_PREAMBLE_VHT_SU: case WIFI_PREAMBLE_HE_SU: + case WIFI_PREAMBLE_VHT_MU: + case WIFI_PREAMBLE_HE_MU: //VHT-SIG-A1 and HE-SIG-A1 return MicroSeconds (4); default: @@ -1843,8 +1847,10 @@ WifiPhy::GetPlcpSigA2Duration (WifiPreamble preamble) { switch (preamble) { - case WIFI_PREAMBLE_VHT: + case WIFI_PREAMBLE_VHT_SU: case WIFI_PREAMBLE_HE_SU: + case WIFI_PREAMBLE_VHT_MU: + case WIFI_PREAMBLE_HE_MU: //VHT-SIG-A2 and HE-SIG-A2 return MicroSeconds (4); default: @@ -1858,12 +1864,9 @@ WifiPhy::GetPlcpSigBDuration (WifiPreamble preamble) { switch (preamble) { - case WIFI_PREAMBLE_VHT: - //VHT-SIG-B + case WIFI_PREAMBLE_VHT_MU: + case WIFI_PREAMBLE_HE_MU: return MicroSeconds (4); - case WIFI_PREAMBLE_HE_SU: - //HE-SIG-B: MU not supported so HE-SIG-B not used - return MicroSeconds (0); default: // no SIG-B return MicroSeconds (0); diff --git a/src/wifi/model/wifi-preamble.h b/src/wifi/model/wifi-preamble.h index 1f1ac38d8..d3849269d 100644 --- a/src/wifi/model/wifi-preamble.h +++ b/src/wifi/model/wifi-preamble.h @@ -33,7 +33,8 @@ enum WifiPreamble WIFI_PREAMBLE_SHORT, WIFI_PREAMBLE_HT_MF, WIFI_PREAMBLE_HT_GF, - WIFI_PREAMBLE_VHT, + WIFI_PREAMBLE_VHT_SU, + WIFI_PREAMBLE_VHT_MU, WIFI_PREAMBLE_HE_SU, WIFI_PREAMBLE_HE_ER_SU, WIFI_PREAMBLE_HE_MU, diff --git a/src/wifi/model/wifi-remote-station-manager.cc b/src/wifi/model/wifi-remote-station-manager.cc index c1ed5dd49..6b7877260 100644 --- a/src/wifi/model/wifi-remote-station-manager.cc +++ b/src/wifi/model/wifi-remote-station-manager.cc @@ -622,7 +622,7 @@ WifiRemoteStationManager::DoGetCtsToSelfTxVector (void) } else if (defaultMode.GetModulationClass () == WIFI_MOD_CLASS_VHT) { - defaultPreamble = WIFI_PREAMBLE_VHT; + defaultPreamble = WIFI_PREAMBLE_VHT_SU; } else if (defaultMode.GetModulationClass () == WIFI_MOD_CLASS_HT) { diff --git a/src/wifi/model/wifi-utils.cc b/src/wifi/model/wifi-utils.cc index 02d8a60f2..197d04a4f 100644 --- a/src/wifi/model/wifi-utils.cc +++ b/src/wifi/model/wifi-utils.cc @@ -133,7 +133,7 @@ GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreambl } else if (modulation == WIFI_MOD_CLASS_VHT) { - return WIFI_PREAMBLE_VHT; + return WIFI_PREAMBLE_VHT_SU; } else if (modulation == WIFI_MOD_CLASS_HT && useGreenfield) { @@ -251,7 +251,8 @@ GetPpduMaxTime (WifiPreamble preamble) duration = MicroSeconds (10000); break; case WIFI_PREAMBLE_HT_MF: - case WIFI_PREAMBLE_VHT: + case WIFI_PREAMBLE_VHT_SU: + case WIFI_PREAMBLE_VHT_MU: case WIFI_PREAMBLE_HE_SU: case WIFI_PREAMBLE_HE_ER_SU: case WIFI_PREAMBLE_HE_MU: diff --git a/src/wifi/test/tx-duration-test.cc b/src/wifi/test/tx-duration-test.cc index cda85a3a5..2d98e819d 100644 --- a/src/wifi/test/tx-duration-test.cc +++ b/src/wifi/test/tx-duration-test.cc @@ -315,36 +315,36 @@ TxDurationTest::DoRun (void) //802.11ac durations retval = retval - && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT, MicroSeconds (200)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT, MicroSeconds (52)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT, MicroSeconds (44)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT, MicroSeconds (184)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT, NanoSeconds (50800)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT, NanoSeconds (43600)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT, MicroSeconds (112)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT, MicroSeconds (44)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT, MicroSeconds (44)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT, NanoSeconds (104800)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT, NanoSeconds (43600)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT, NanoSeconds (43600)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT, MicroSeconds (464)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT, MicroSeconds (64)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT, MicroSeconds (48)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT, NanoSeconds (421600)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT, NanoSeconds (61600)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT, NanoSeconds (47200)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT, MicroSeconds (72)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT, MicroSeconds (44)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT, MicroSeconds (44)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT, NanoSeconds (68800)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT, NanoSeconds (43600)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT, NanoSeconds (43600)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT, MicroSeconds (60)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT, MicroSeconds (44)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT, MicroSeconds (44)) - && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT, MicroSeconds (58)) - && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT, NanoSeconds (43600)) - && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT, NanoSeconds (43600)); + && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (196)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (48)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, MicroSeconds (180)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (46800)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (108)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (100800)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (460)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (60)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (44)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (417600)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (57600)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (43200)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (68)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (64800)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (56)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40)) + && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, MicroSeconds (54)) + && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600)) + && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600)); NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11ac duration failed");