diff -r aba202c0c922 src/wifi/model/interference-helper.cc --- a/src/wifi/model/interference-helper.cc Thu Apr 30 18:02:42 2015 -0400 +++ b/src/wifi/model/interference-helper.cc Sat May 02 00:54:03 2015 +0200 @@ -274,25 +274,25 @@ Time previous = (*j).GetTime (); WifiMode payloadMode = event->GetPayloadMode (); WifiPreamble preamble = event->GetPreambleType (); - WifiMode MfHeaderMode ; - if (preamble==WIFI_PREAMBLE_HT_MF) + WifiMode HtHeaderMode ; + if (preamble == WIFI_PREAMBLE_HT_MF) { - MfHeaderMode = WifiPhy::GetMFPlcpHeaderMode (payloadMode, preamble); //return L-SIG mode - + //mode for HT modulation + HtHeaderMode = WifiPhy::GetHTPlcpHeaderMode (payloadMode, preamble); } - WifiMode headerMode = WifiPhy::GetPlcpHeaderMode (payloadMode, preamble); - Time plcpHeaderStart = (*j).GetTime () + WifiPhy::GetPlcpPreambleDuration (payloadMode, preamble); //packet start time+ preamble - Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (payloadMode, preamble);//packet start time+ preamble+L SIG - Time plcpHtTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble);//packet start time+ preamble+L SIG+HT SIG - Time plcpPayloadStart =plcpHtTrainingSymbolsStart + WifiPhy::GetPlcpHtTrainingSymbolDuration (preamble,event->GetTxVector()); //packet start time+ preamble+L SIG+HT SIG+Training + WifiMode headerMode = WifiPhy::GetPlcpHeaderMode (payloadMode, preamble); //mode for OFDM modulation + Time plcpHeaderStart = (*j).GetTime () + WifiPhy::GetPlcpPreambleDuration (payloadMode, preamble); //packet start time + preamble + Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (payloadMode, preamble); //packet start time + preamble + L-SIG + Time plcpHtTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble); //packet start time + preamble + L-SIG + HT-SIG + Time plcpPayloadStart = plcpHtTrainingSymbolsStart + WifiPhy::GetPlcpHtTrainingSymbolDuration (preamble, event->GetTxVector()); //packet start time + preamble + L-SIG + HT-SIG + HT Training double noiseInterferenceW = (*j).GetDelta (); double powerW = event->GetRxPowerW (); - j++; + j++; while (ni->end () != j) { Time current = (*j).GetTime (); NS_ASSERT (current >= previous); - //Case 1: Both prev and curr point to the payload + //Case 1: Both previous and current point in the payload if (previous >= plcpPayloadStart) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, @@ -301,148 +301,139 @@ current - previous, payloadMode); } - //Case 2: previous is before payload + //Case 2: previous is in L-SIG for non-HT and in HT training for HT else if (previous >= plcpHtTrainingSymbolsStart) { //Case 2a: current is after payload if (current >= plcpPayloadStart) { - //Case 2ai and 2aii: All formats + //All formats psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, payloadMode), - current - plcpPayloadStart, - payloadMode); - - } + current - plcpPayloadStart, + payloadMode); + //Case 2ai: non-HT format + if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + headerMode), + plcpPayloadStart - previous, + headerMode); + } + //Case 2aii: HT format + else + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + plcpPayloadStart - previous, + HtHeaderMode); + } + } + //Case 2b: current and previous before payload (in L-SIG for non-HT and in HT training for HT) + else + { + //Case 2bi: non-HT format + if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + headerMode), + current - previous, + headerMode); + } + //Case 2bii: HT format + else + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + current - previous, + HtHeaderMode); + } + } } //Case 3: previous is in HT-SIG: Non HT will not enter here since it didn't enter in the last two and they are all the same for non HT - else if (previous >=plcpHsigHeaderStart) + else if (previous >= plcpHsigHeaderStart) { - //Case 3a: cuurent after payload start - if (current >=plcpPayloadStart) + //Case 3a: current after payload start + if (current >= plcpPayloadStart) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - payloadMode), - current - plcpPayloadStart, - payloadMode); + noiseInterferenceW, + payloadMode), + current - plcpPayloadStart, + payloadMode); psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - plcpHtTrainingSymbolsStart - previous, - headerMode); - } - //case 3b: current after HT training symbols start - else if (current >=plcpHtTrainingSymbolsStart) + noiseInterferenceW, + HtHeaderMode), + plcpPayloadStart - previous, + HtHeaderMode); + } + //case 3b: current in HT-SIG or in HT training + else { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, - headerMode), - plcpHtTrainingSymbolsStart - previous, - headerMode); + HtHeaderMode), + current - previous, + HtHeaderMode); } - //Case 3c: current is with previous in HT sig - else - { + } + //Case 4: previous in L-SIG: non-HT and GF will not reach here because it will execute the previous if and exit + else if (previous >= plcpHeaderStart) + { + //Case 4a: current after payload start + if (current >= plcpPayloadStart) + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + payloadMode), + current - plcpPayloadStart, + payloadMode); + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + plcpPayloadStart - plcpHsigHeaderStart, + HtHeaderMode); psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, headerMode), - current- previous, - headerMode); - - } - } - //Case 4: previous in L-SIG: GF will not reach here because it will execute the previous if and exit - else if (previous >= plcpHeaderStart) - { - //Case 4a: current after payload start - if (current >=plcpPayloadStart) - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - payloadMode), - current - plcpPayloadStart, - payloadMode); - //Case 4ai: Non HT format (No HT-SIG or Training Symbols) - if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) //plcpHtTrainingSymbolsStart==plcpHeaderStart) - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - plcpPayloadStart - previous, - headerMode); - } - - else{ - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - plcpHtTrainingSymbolsStart - plcpHsigHeaderStart, - headerMode); - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - MfHeaderMode), - plcpHsigHeaderStart - previous, - MfHeaderMode); - } - } - //Case 4b: current in HT training symbol. non HT will not come here since it went in previous if or if the previous ifis not true this will be not true - else if (current >=plcpHtTrainingSymbolsStart) - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - plcpHtTrainingSymbolsStart - plcpHsigHeaderStart, + plcpHsigHeaderStart - previous, headerMode); - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - MfHeaderMode), - plcpHsigHeaderStart - previous, - MfHeaderMode); - } - //Case 4c: current in H sig.non HT will not come here since it went in previous if or if the previous ifis not true this will be not true - else if (current >=plcpHsigHeaderStart) + } + //Case 4b: current in in HT-SIG or in HT training symbol. + else if (current >= plcpHtTrainingSymbolsStart) { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, + HtHeaderMode), + current - plcpHsigHeaderStart, + HtHeaderMode); + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, headerMode), - current - plcpHsigHeaderStart, + plcpHsigHeaderStart - previous, headerMode); - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - MfHeaderMode), - plcpHsigHeaderStart - previous, - MfHeaderMode); - - } - //Case 4d: Current with prev in L SIG + } + //Case 4c: current with previous in L-SIG else - { - //Case 4di: Non HT format (No HT-SIG or Training Symbols) - if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) //plcpHtTrainingSymbolsStart==plcpHeaderStart) - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - current - previous, - headerMode); - } - else - { + { psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - MfHeaderMode), - current - previous, - MfHeaderMode); - } - } + noiseInterferenceW, + headerMode), + current - previous, + headerMode); + } } //Case 5: previous is in the preamble works for all cases else { + //Case 5a: current after payload if (current >= plcpPayloadStart) { //for all @@ -452,82 +443,82 @@ current - plcpPayloadStart, payloadMode); - // Non HT format (No HT-SIG or Training Symbols) + //Case 5ai: Non HT format (No HT-SIG or Training Symbols) if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, headerMode), plcpPayloadStart - plcpHeaderStart, headerMode); + } + //Case 5aii: Greenfield or Mixed format else - // Greenfield or Mixed format - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - plcpHtTrainingSymbolsStart - plcpHsigHeaderStart, - headerMode); - if (preamble == WIFI_PREAMBLE_HT_MF) - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, noiseInterferenceW, - MfHeaderMode), - plcpHsigHeaderStart-plcpHeaderStart, - MfHeaderMode); + HtHeaderMode), + plcpPayloadStart - plcpHsigHeaderStart, + HtHeaderMode); + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + plcpHsigHeaderStart - plcpHeaderStart, + headerMode); + } } - else if (current >=plcpHtTrainingSymbolsStart ) - { - // Non HT format will not come here since it will execute prev if - // Greenfield or Mixed format - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - plcpHtTrainingSymbolsStart - plcpHsigHeaderStart, - headerMode); - if (preamble == WIFI_PREAMBLE_HT_MF) - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - MfHeaderMode), - plcpHsigHeaderStart-plcpHeaderStart, - MfHeaderMode); - } - //non HT will not come here - else if (current >=plcpHsigHeaderStart) - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - headerMode), - current- plcpHsigHeaderStart, - headerMode); - if (preamble != WIFI_PREAMBLE_HT_GF) - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - MfHeaderMode), - plcpHsigHeaderStart-plcpHeaderStart, - MfHeaderMode); - } - } - // GF will not come here - else if (current >= plcpHeaderStart) + //Case 5b: current before payload + else if (current >= plcpHtTrainingSymbolsStart ) { - if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, + //Case 5bi: current in L-SIG (Non HT format) + if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, headerMode), current - plcpHeaderStart, headerMode); - } + } + //Case 5bii: current in HT training (Greenfield or Mixed format) else - { - psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, - noiseInterferenceW, - MfHeaderMode), - current - plcpHeaderStart, - MfHeaderMode); - } + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + current - plcpHsigHeaderStart, + HtHeaderMode); + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + plcpHsigHeaderStart - plcpHeaderStart, + headerMode); + } + } + //Case 5c: non HT will not come here (current in HT-SIG) + else if (current >= plcpHsigHeaderStart) + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + current - plcpHsigHeaderStart, + HtHeaderMode); + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + plcpHsigHeaderStart - plcpHeaderStart, + headerMode); + } + //Case 5d: GF will not come here (current in L-SIG) + else if (current >= plcpHeaderStart) + { + psr *= CalculateChunkSuccessRate (CalculateSnr (powerW, + noiseInterferenceW, + HtHeaderMode), + current - plcpHeaderStart, + headerMode); } } - + noiseInterferenceW += (*j).GetDelta (); previous = (*j).GetTime (); j++; diff -r aba202c0c922 src/wifi/model/wifi-phy.cc --- a/src/wifi/model/wifi-phy.cc Thu Apr 30 18:02:42 2015 -0400 +++ b/src/wifi/model/wifi-phy.cc Sat May 02 00:54:03 2015 +0200 @@ -117,9 +117,8 @@ NS_LOG_FUNCTION (this); } -//return the L-SIG WifiMode -WifiPhy::GetMFPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble) +WifiPhy::GetHTPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble) { switch (payloadMode.GetBandwidth ()) { @@ -168,7 +167,6 @@ } } -//return L-SIG Time WifiPhy::GetPlcpHtSigHeaderDuration (WifiPreamble preamble) { @@ -191,6 +189,7 @@ { switch (payloadMode.GetModulationClass ()) { + case WIFI_MOD_CLASS_HT: case WIFI_MOD_CLASS_OFDM: { switch (payloadMode.GetBandwidth ()) @@ -207,36 +206,6 @@ 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: - switch (payloadMode.GetBandwidth ()) - { - case 20000000: - return WifiPhy::GetOfdmRate13MbpsBW20MHz (); - case 40000000: - return WifiPhy::GetOfdmRate27MbpsBW40MHz (); - default: - return WifiPhy::GetOfdmRate13MbpsBW20MHz (); - } - case WIFI_PREAMBLE_HT_GF: - switch (payloadMode.GetBandwidth ()) - { - case 20000000: - return WifiPhy::GetOfdmRate13MbpsBW20MHz (); - case 40000000: - return WifiPhy::GetOfdmRate27MbpsBW40MHz (); - default: - return WifiPhy::GetOfdmRate13MbpsBW20MHz (); - } - default: - return WifiPhy::GetOfdmRate6Mbps (); - } - } case WIFI_MOD_CLASS_ERP_OFDM: return WifiPhy::GetErpOfdmRate6Mbps (); diff -r aba202c0c922 src/wifi/model/wifi-phy.h --- a/src/wifi/model/wifi-phy.h Thu Apr 30 18:02:42 2015 -0400 +++ b/src/wifi/model/wifi-phy.h Sat May 02 00:54:03 2015 +0200 @@ -307,9 +307,9 @@ * \param payloadMode the WifiMode use for the transmission of the payload * \param preamble the type of preamble * - * \return the WifiMode used for the transmission of the HT-SIG in Mixed Format and greenfield format PLCP header + * \return the WifiMode used for the transmission of the HT-SIG and HT training in Mixed Format and greenfield format PLCP header */ - static WifiMode GetMFPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble); + static WifiMode GetHTPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble); /** * \param preamble the type of preamble *