wifi: Differenciate VHT preamble for SU and MU transmissions

This commit is contained in:
Sébastien Deronne
2019-05-01 08:29:09 +02:00
parent c1cc5a88ac
commit bf2e9d3c84
7 changed files with 60 additions and 55 deletions

View File

@@ -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
{

View File

@@ -492,12 +492,12 @@ InterferenceHelper::CalculateNonLegacyPhyHeaderPer (Ptr<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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,

View File

@@ -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);

View File

@@ -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,

View File

@@ -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)
{

View File

@@ -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:

View File

@@ -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");