From bbfa0bce106da8555dc8cda42f0c8f29ad6bf958 Mon Sep 17 00:00:00 2001 From: Muhammad Iqbal CR Date: Fri, 4 Dec 2020 17:01:43 -0600 Subject: [PATCH] wifi: Streamline creation of WifiMode in PhyEntity classes --- src/wifi/model/dsss-phy.cc | 44 +++-- src/wifi/model/dsss-phy.h | 11 ++ src/wifi/model/erp-ofdm-phy.cc | 70 +++----- src/wifi/model/erp-ofdm-phy.h | 11 ++ src/wifi/model/he-phy.cc | 119 +++---------- src/wifi/model/he-phy.h | 11 +- src/wifi/model/ht-phy.cc | 299 ++++++--------------------------- src/wifi/model/ht-phy.h | 10 ++ src/wifi/model/ofdm-phy.cc | 182 +++++--------------- src/wifi/model/ofdm-phy.h | 11 ++ src/wifi/model/vht-phy.cc | 101 +++-------- src/wifi/model/vht-phy.h | 10 ++ 12 files changed, 242 insertions(+), 637 deletions(-) diff --git a/src/wifi/model/dsss-phy.cc b/src/wifi/model/dsss-phy.cc index d79188cdf..d5dc82c4d 100644 --- a/src/wifi/model/dsss-phy.cc +++ b/src/wifi/model/dsss-phy.cc @@ -262,24 +262,14 @@ DsssPhy::GetDsssRatesBpsList (void) WifiMode DsssPhy::GetDsssRate1Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("DsssRate1Mbps", - WIFI_MOD_CLASS_DSSS, - true, - WIFI_CODE_RATE_UNDEFINED, - 2); + static WifiMode mode = CreateDsssMode ("DsssRate1Mbps", WIFI_MOD_CLASS_DSSS); return mode; } WifiMode DsssPhy::GetDsssRate2Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("DsssRate2Mbps", - WIFI_MOD_CLASS_DSSS, - true, - WIFI_CODE_RATE_UNDEFINED, - 4); + static WifiMode mode = CreateDsssMode ("DsssRate2Mbps", WIFI_MOD_CLASS_DSSS); return mode; } @@ -289,27 +279,33 @@ DsssPhy::GetDsssRate2Mbps (void) WifiMode DsssPhy::GetDsssRate5_5Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("DsssRate5_5Mbps", - WIFI_MOD_CLASS_HR_DSSS, - true, - WIFI_CODE_RATE_UNDEFINED, - 16); + static WifiMode mode = CreateDsssMode ("DsssRate5_5Mbps", WIFI_MOD_CLASS_HR_DSSS); return mode; } WifiMode DsssPhy::GetDsssRate11Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("DsssRate11Mbps", - WIFI_MOD_CLASS_HR_DSSS, - true, - WIFI_CODE_RATE_UNDEFINED, - 256); + static WifiMode mode = CreateDsssMode ("DsssRate11Mbps", WIFI_MOD_CLASS_HR_DSSS); return mode; } +WifiMode +DsssPhy::CreateDsssMode (std::string uniqueName, + WifiModulationClass modClass) +{ + // Check whether uniqueName is in lookup table + const auto it = m_dsssModulationLookupTable.find (uniqueName); + NS_ASSERT_MSG (it != m_dsssModulationLookupTable.end (), "DSSS or HR/DSSS mode cannot be created because it is not in the lookup table!"); + NS_ASSERT_MSG (modClass == WIFI_MOD_CLASS_DSSS || modClass == WIFI_MOD_CLASS_HR_DSSS, "DSSS or HR/DSSS mode must be either WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS!"); + + return WifiModeFactory::CreateWifiMode (uniqueName, + modClass, + true, + GetCodeRate (uniqueName), + GetConstellationSize (uniqueName)); +} + WifiCodeRate DsssPhy::GetCodeRate (const std::string& name) { diff --git a/src/wifi/model/dsss-phy.h b/src/wifi/model/dsss-phy.h index f5f74f9f6..46ef06987 100644 --- a/src/wifi/model/dsss-phy.h +++ b/src/wifi/model/dsss-phy.h @@ -195,6 +195,17 @@ private: */ PhyFieldRxStatus EndReceiveHeader (Ptr event); + /** + * Create a DSSS or HR/DSSS mode from a unique name, the unique name + * must already be contained inside ModulationLookupTable. + * This method binds all the callbacks used by WifiMode. + * + * \param uniqueName the unique name of the WifiMode + * \param modClass the modulation class of the WifiMode, must be either WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS + * \return the DSSS or HR/DSSS WifiMode + */ + static WifiMode CreateDsssMode (std::string uniqueName, WifiModulationClass modClass); + static const PpduFormats m_dsssPpduFormats; //!< DSSS and HR/DSSS PPDU formats static const ModulationLookupTable m_dsssModulationLookupTable; //!< lookup table to retrieve code rate and constellation size corresponding to a unique name of modulation diff --git a/src/wifi/model/erp-ofdm-phy.cc b/src/wifi/model/erp-ofdm-phy.cc index b4530a34e..2435406fe 100644 --- a/src/wifi/model/erp-ofdm-phy.cc +++ b/src/wifi/model/erp-ofdm-phy.cc @@ -138,99 +138,73 @@ ErpOfdmPhy::GetErpOfdmRatesBpsList (void) WifiMode ErpOfdmPhy::GetErpOfdmRate6Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate6Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - true, - WIFI_CODE_RATE_1_2, - 2); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate6Mbps", true); return mode; } WifiMode ErpOfdmPhy::GetErpOfdmRate9Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate9Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - false, - WIFI_CODE_RATE_3_4, - 2); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate9Mbps", false); return mode; } WifiMode ErpOfdmPhy::GetErpOfdmRate12Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate12Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - true, - WIFI_CODE_RATE_1_2, - 4); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate12Mbps", true); return mode; } WifiMode ErpOfdmPhy::GetErpOfdmRate18Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate18Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - false, - WIFI_CODE_RATE_3_4, - 4); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate18Mbps", false); return mode; } WifiMode ErpOfdmPhy::GetErpOfdmRate24Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate24Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - true, - WIFI_CODE_RATE_1_2, - 16); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate24Mbps", true); return mode; } WifiMode ErpOfdmPhy::GetErpOfdmRate36Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate36Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - false, - WIFI_CODE_RATE_3_4, - 16); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate36Mbps", false); return mode; } WifiMode ErpOfdmPhy::GetErpOfdmRate48Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate48Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - false, - WIFI_CODE_RATE_2_3, - 64); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate48Mbps", false); return mode; } WifiMode ErpOfdmPhy::GetErpOfdmRate54Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("ErpOfdmRate54Mbps", - WIFI_MOD_CLASS_ERP_OFDM, - false, - WIFI_CODE_RATE_3_4, - 64); + static WifiMode mode = CreateErpOfdmMode ("ErpOfdmRate54Mbps", false); return mode; } +WifiMode +ErpOfdmPhy::CreateErpOfdmMode (std::string uniqueName, bool isMandatory) +{ + // Check whether uniqueName is in lookup table + const auto it = m_erpOfdmModulationLookupTable.find (uniqueName); + NS_ASSERT_MSG (it != m_erpOfdmModulationLookupTable.end (), "ERP-OFDM mode cannot be created because it is not in the lookup table!"); + + return WifiModeFactory::CreateWifiMode (uniqueName, + WIFI_MOD_CLASS_ERP_OFDM, + isMandatory, + GetCodeRate (uniqueName), + GetConstellationSize (uniqueName)); +} + WifiCodeRate ErpOfdmPhy::GetCodeRate (const std::string& name) { diff --git a/src/wifi/model/erp-ofdm-phy.h b/src/wifi/model/erp-ofdm-phy.h index a8f30a06e..1e0101ed1 100644 --- a/src/wifi/model/erp-ofdm-phy.h +++ b/src/wifi/model/erp-ofdm-phy.h @@ -198,6 +198,17 @@ private: Time GetPreambleDuration (WifiTxVector txVector) const override; Time GetHeaderDuration (WifiTxVector txVector) const override; + /** + * Create an ERP-OFDM mode from a unique name, the unique name + * must already be contained inside ModulationLookupTable. + * This method binds all the callbacks used by WifiMode. + * + * \param uniqueName the unique name of the WifiMode + * \param isMandatory whether the WifiMode is mandatory + * \return the ERP-OFDM WifiMode + */ + static WifiMode CreateErpOfdmMode (std::string uniqueName, bool isMandatory); + static const ModulationLookupTable m_erpOfdmModulationLookupTable; //!< lookup table to retrieve code rate and constellation size corresponding to a unique name of modulation }; //class ErpOfdmPhy diff --git a/src/wifi/model/he-phy.cc b/src/wifi/model/he-phy.cc index b3b4cc319..21f0f38af 100644 --- a/src/wifi/model/he-phy.cc +++ b/src/wifi/model/he-phy.cc @@ -97,7 +97,7 @@ HePhy::BuildModeList (void) for (uint8_t index = 0; index <= m_maxSupportedMcsIndexPerSs; ++index) { NS_LOG_LOGIC ("Add HeMcs" << +index << " to list"); - m_modeList.emplace_back (GetHeMcs (index)); + m_modeList.emplace_back (CreateHeMcs (index)); } } @@ -978,100 +978,35 @@ HePhy::GetHeMcs (uint8_t index) } } -WifiMode -HePhy::GetHeMcs0 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs0", 0, WIFI_MOD_CLASS_HE); - return mcs; -} +#define GET_HE_MCS(x) \ +WifiMode \ +HePhy::GetHeMcs ## x (void) \ +{ \ + static WifiMode mcs = CreateHeMcs (x); \ + return mcs; \ +} \ + +GET_HE_MCS (0); +GET_HE_MCS (1); +GET_HE_MCS (2); +GET_HE_MCS (3); +GET_HE_MCS (4); +GET_HE_MCS (5); +GET_HE_MCS (6); +GET_HE_MCS (7); +GET_HE_MCS (8); +GET_HE_MCS (9); +GET_HE_MCS (10); +GET_HE_MCS (11); +#undef GET_HE_MCS WifiMode -HePhy::GetHeMcs1 (void) +HePhy::CreateHeMcs (uint8_t index) { - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs1", 1, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs2 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs2", 2, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs3 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs3", 3, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs4 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs4", 4, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs5 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs5", 5, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs6 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs6", 6, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs7 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs7", 7, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs8 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs8", 8, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs9 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs9", 9, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs10 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs10", 10, WIFI_MOD_CLASS_HE); - return mcs; -} - -WifiMode -HePhy::GetHeMcs11 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HeMcs11", 11, WIFI_MOD_CLASS_HE); - return mcs; + NS_ASSERT_MSG (index <= 11, "HeMcs index must be <= 11!"); + return WifiModeFactory::CreateWifiMcs ("HeMcs" + std::to_string (index), + index, + WIFI_MOD_CLASS_HE); } WifiCodeRate diff --git a/src/wifi/model/he-phy.h b/src/wifi/model/he-phy.h index 843a1e0d9..0c5e70ead 100644 --- a/src/wifi/model/he-phy.h +++ b/src/wifi/model/he-phy.h @@ -386,13 +386,22 @@ protected: std::map m_beginOfdmaPayloadRxEvents; //!< the beginning of the OFDMA payload reception events (indexed by STA-ID) EndOfHeSigACallback m_endOfHeSigACallback; //!< end of HE-SIG-A callback - private: // Inherited virtual void BuildModeList (void) override; uint8_t GetNumberBccEncoders (WifiTxVector txVector) const override; virtual Time GetSymbolDuration (WifiTxVector txVector) const override; + /** + * Create and return the HE MCS corresponding to + * the provided index. + * This method binds all the callbacks used by WifiMode. + * + * \param index the index of the MCS + * \return an HE MCS + */ + static WifiMode CreateHeMcs (uint8_t index); + static const PpduFormats m_hePpduFormats; //!< HE PPDU formats }; //class HePhy diff --git a/src/wifi/model/ht-phy.cc b/src/wifi/model/ht-phy.cc index e99f8116f..2d6a252f1 100644 --- a/src/wifi/model/ht-phy.cc +++ b/src/wifi/model/ht-phy.cc @@ -82,7 +82,7 @@ HtPhy::BuildModeList (void) for (uint8_t i = 0; i <= m_maxSupportedMcsIndexPerSs; ++i) { NS_LOG_LOGIC ("Add HtMcs" << +index << " to list"); - m_modeList.emplace_back (GetHtMcs (index)); + m_modeList.emplace_back (CreateHtMcs (index)); ++index; } index = 8 * nss; @@ -539,260 +539,55 @@ HtPhy::GetHtMcs (uint8_t index) } } -WifiMode -HtPhy::GetHtMcs0 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs0", 0, WIFI_MOD_CLASS_HT); - return mcs; -} +#define GET_HT_MCS(x) \ +WifiMode \ +HtPhy::GetHtMcs ## x (void) \ +{ \ + static WifiMode mcs = CreateHtMcs (x); \ + return mcs; \ +} \ + +GET_HT_MCS (0); +GET_HT_MCS (1); +GET_HT_MCS (2); +GET_HT_MCS (3); +GET_HT_MCS (4); +GET_HT_MCS (5); +GET_HT_MCS (6); +GET_HT_MCS (7); +GET_HT_MCS (8); +GET_HT_MCS (9); +GET_HT_MCS (10); +GET_HT_MCS (11); +GET_HT_MCS (12); +GET_HT_MCS (13); +GET_HT_MCS (14); +GET_HT_MCS (15); +GET_HT_MCS (16); +GET_HT_MCS (17); +GET_HT_MCS (18); +GET_HT_MCS (19); +GET_HT_MCS (20); +GET_HT_MCS (21); +GET_HT_MCS (22); +GET_HT_MCS (23); +GET_HT_MCS (24); +GET_HT_MCS (25); +GET_HT_MCS (26); +GET_HT_MCS (27); +GET_HT_MCS (28); +GET_HT_MCS (29); +GET_HT_MCS (30); +GET_HT_MCS (31); +#undef GET_HT_MCS WifiMode -HtPhy::GetHtMcs1 (void) +HtPhy::CreateHtMcs (uint8_t index) { - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs1", 1, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs2 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs2", 2, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs3 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs3", 3, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs4 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs4", 4, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs5 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs5", 5, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs6 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs6", 6, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs7 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs7", 7, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs8 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs8", 8, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs9 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs9", 9, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs10 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs10", 10, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs11 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs11", 11, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs12 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs12", 12, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs13 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs13", 13, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs14 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs14", 14, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs15 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs15", 15, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs16 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs16", 16, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs17 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs17", 17, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs18 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs18", 18, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs19 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs19", 19, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs20 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs20", 20, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs21 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs21", 21, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs22 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs22", 22, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs23 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs23", 23, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs24 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs24", 24, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs25 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs25", 25, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs26 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs26", 26, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs27 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs27", 27, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs28 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs28", 28, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs29 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs29", 29, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs30 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs30", 30, WIFI_MOD_CLASS_HT); - return mcs; -} - -WifiMode -HtPhy::GetHtMcs31 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("HtMcs31", 31, WIFI_MOD_CLASS_HT); - return mcs; + NS_ASSERT_MSG (index <= 31, "HtMcs index must be <= 31!"); + return WifiModeFactory::CreateWifiMcs ("HtMcs" + std::to_string (index), + index, + WIFI_MOD_CLASS_HT); } WifiCodeRate diff --git a/src/wifi/model/ht-phy.h b/src/wifi/model/ht-phy.h index b80cbe969..f0cdd2f64 100644 --- a/src/wifi/model/ht-phy.h +++ b/src/wifi/model/ht-phy.h @@ -528,6 +528,16 @@ private: */ PhyFieldRxStatus EndReceiveHtSig (Ptr event); + /** + * Return the HT MCS corresponding to + * the provided index. + * This method binds all the callbacks used by WifiMode. + * + * \param index the index of the MCS + * \return an HT MCS + */ + static WifiMode CreateHtMcs (uint8_t index); + uint8_t m_maxSupportedNss; //!< Maximum supported number of spatial streams (used to build HT MCS indices) static const PpduFormats m_htPpduFormats; //!< HT PPDU formats diff --git a/src/wifi/model/ofdm-phy.cc b/src/wifi/model/ofdm-phy.cc index 199f88bef..156a1169c 100644 --- a/src/wifi/model/ofdm-phy.cc +++ b/src/wifi/model/ofdm-phy.cc @@ -455,96 +455,56 @@ OfdmPhy::GetOfdmRatesBpsList (void) WifiMode OfdmPhy::GetOfdmRate6Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate6Mbps", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 2); + static WifiMode mode = CreateOfdmMode ("OfdmRate6Mbps", true); return mode; } WifiMode OfdmPhy::GetOfdmRate9Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate9Mbps", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 2); + static WifiMode mode = CreateOfdmMode ("OfdmRate9Mbps", false); return mode; } WifiMode OfdmPhy::GetOfdmRate12Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate12Mbps", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 4); + static WifiMode mode = CreateOfdmMode ("OfdmRate12Mbps", true); return mode; } WifiMode OfdmPhy::GetOfdmRate18Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate18Mbps", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 4); + static WifiMode mode = CreateOfdmMode ("OfdmRate18Mbps", false); return mode; } WifiMode OfdmPhy::GetOfdmRate24Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate24Mbps", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 16); + static WifiMode mode = CreateOfdmMode ("OfdmRate24Mbps", true); return mode; } WifiMode OfdmPhy::GetOfdmRate36Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate36Mbps", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 16); + static WifiMode mode = CreateOfdmMode ("OfdmRate36Mbps", false); return mode; } WifiMode OfdmPhy::GetOfdmRate48Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate48Mbps", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_2_3, - 64); + static WifiMode mode = CreateOfdmMode ("OfdmRate48Mbps", false); return mode; } WifiMode OfdmPhy::GetOfdmRate54Mbps (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate54Mbps", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 64); + static WifiMode mode = CreateOfdmMode ("OfdmRate54Mbps", false); return mode; } @@ -554,96 +514,56 @@ OfdmPhy::GetOfdmRate54Mbps (void) WifiMode OfdmPhy::GetOfdmRate3MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 2); + static WifiMode mode = CreateOfdmMode ("OfdmRate3MbpsBW10MHz", true); return mode; } WifiMode OfdmPhy::GetOfdmRate4_5MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 2); + static WifiMode mode = CreateOfdmMode ("OfdmRate4_5MbpsBW10MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate6MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 4); + static WifiMode mode = CreateOfdmMode ("OfdmRate6MbpsBW10MHz", true); return mode; } WifiMode OfdmPhy::GetOfdmRate9MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 4); + static WifiMode mode = CreateOfdmMode ("OfdmRate9MbpsBW10MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate12MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 16); + static WifiMode mode = CreateOfdmMode ("OfdmRate12MbpsBW10MHz", true); return mode; } WifiMode OfdmPhy::GetOfdmRate18MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate18MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 16); + static WifiMode mode = CreateOfdmMode ("OfdmRate18MbpsBW10MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate24MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate24MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_2_3, - 64); + static WifiMode mode = CreateOfdmMode ("OfdmRate24MbpsBW10MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate27MbpsBW10MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate27MbpsBW10MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 64); + static WifiMode mode = CreateOfdmMode ("OfdmRate27MbpsBW10MHz", false); return mode; } @@ -653,99 +573,73 @@ OfdmPhy::GetOfdmRate27MbpsBW10MHz (void) WifiMode OfdmPhy::GetOfdmRate1_5MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate1_5MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 2); + static WifiMode mode = CreateOfdmMode ("OfdmRate1_5MbpsBW5MHz", true); return mode; } WifiMode OfdmPhy::GetOfdmRate2_25MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate2_25MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 2); + static WifiMode mode = CreateOfdmMode ("OfdmRate2_25MbpsBW5MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate3MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 4); + static WifiMode mode = CreateOfdmMode ("OfdmRate3MbpsBW5MHz", true); return mode; } WifiMode OfdmPhy::GetOfdmRate4_5MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 4); + static WifiMode mode = CreateOfdmMode ("OfdmRate4_5MbpsBW5MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate6MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - true, - WIFI_CODE_RATE_1_2, - 16); + static WifiMode mode = CreateOfdmMode ("OfdmRate6MbpsBW5MHz", true); return mode; } WifiMode OfdmPhy::GetOfdmRate9MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 16); + static WifiMode mode = CreateOfdmMode ("OfdmRate9MbpsBW5MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate12MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_2_3, - 64); + static WifiMode mode = CreateOfdmMode ("OfdmRate12MbpsBW5MHz", false); return mode; } WifiMode OfdmPhy::GetOfdmRate13_5MbpsBW5MHz (void) { - static WifiMode mode = - WifiModeFactory::CreateWifiMode ("OfdmRate13_5MbpsBW5MHz", - WIFI_MOD_CLASS_OFDM, - false, - WIFI_CODE_RATE_3_4, - 64); + static WifiMode mode = CreateOfdmMode ("OfdmRate13_5MbpsBW5MHz", false); return mode; } +WifiMode +OfdmPhy::CreateOfdmMode (std::string uniqueName, bool isMandatory) +{ + // Check whether uniqueName is in lookup table + const auto it = m_ofdmModulationLookupTable.find (uniqueName); + NS_ASSERT_MSG (it != m_ofdmModulationLookupTable.end (), "OFDM mode cannot be created because it is not in the lookup table!"); + + return WifiModeFactory::CreateWifiMode (uniqueName, + WIFI_MOD_CLASS_OFDM, + isMandatory, + GetCodeRate (uniqueName), + GetConstellationSize (uniqueName)); +} + WifiCodeRate OfdmPhy::GetCodeRate (const std::string& name) { diff --git a/src/wifi/model/ofdm-phy.h b/src/wifi/model/ofdm-phy.h index 2a168e606..4f1856d5e 100644 --- a/src/wifi/model/ofdm-phy.h +++ b/src/wifi/model/ofdm-phy.h @@ -426,6 +426,17 @@ protected: double codingRate); private: + /** + * Create an OFDM mode from a unique name, the unique name + * must already be contained inside ModulationLookupTable. + * This method binds all the callbacks used by WifiMode. + * + * \param uniqueName the unique name of the WifiMode + * \param isMandatory whether the WifiMode is mandatory + * \return the OFDM WifiMode + */ + static WifiMode CreateOfdmMode (std::string uniqueName, bool isMandatory); + static const PpduFormats m_ofdmPpduFormats; //!< OFDM PPDU formats static const ModulationLookupTable m_ofdmModulationLookupTable; //!< lookup table to retrieve code rate and constellation size corresponding to a unique name of modulation diff --git a/src/wifi/model/vht-phy.cc b/src/wifi/model/vht-phy.cc index 4a65b58ce..642bc7841 100644 --- a/src/wifi/model/vht-phy.cc +++ b/src/wifi/model/vht-phy.cc @@ -95,7 +95,7 @@ VhtPhy::BuildModeList (void) for (uint8_t index = 0; index <= m_maxSupportedMcsIndexPerSs; ++index) { NS_LOG_LOGIC ("Add VhtMcs" << +index << " to list"); - m_modeList.emplace_back (GetVhtMcs (index)); + m_modeList.emplace_back (CreateVhtMcs (index)); } } @@ -355,84 +355,33 @@ VhtPhy::GetVhtMcs (uint8_t index) } } -WifiMode -VhtPhy::GetVhtMcs0 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs0", 0, WIFI_MOD_CLASS_VHT); - return mcs; -} +#define GET_VHT_MCS(x) \ +WifiMode \ +VhtPhy::GetVhtMcs ## x (void) \ +{ \ + static WifiMode mcs = CreateVhtMcs (x); \ + return mcs; \ +} \ + +GET_VHT_MCS (0); +GET_VHT_MCS (1); +GET_VHT_MCS (2); +GET_VHT_MCS (3); +GET_VHT_MCS (4); +GET_VHT_MCS (5); +GET_VHT_MCS (6); +GET_VHT_MCS (7); +GET_VHT_MCS (8); +GET_VHT_MCS (9); +#undef GET_VHT_MCS WifiMode -VhtPhy::GetVhtMcs1 (void) +VhtPhy::CreateVhtMcs (uint8_t index) { - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs1", 1, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs2 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs2", 2, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs3 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs3", 3, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs4 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs4", 4, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs5 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs5", 5, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs6 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs6", 6, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs7 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs7", 7, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs8 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs8", 8, WIFI_MOD_CLASS_VHT); - return mcs; -} - -WifiMode -VhtPhy::GetVhtMcs9 (void) -{ - static WifiMode mcs = - WifiModeFactory::CreateWifiMcs ("VhtMcs9", 9, WIFI_MOD_CLASS_VHT); - return mcs; + NS_ASSERT_MSG (index <= 9, "VhtMcs index must be <= 9!"); + return WifiModeFactory::CreateWifiMcs ("VhtMcs" + std::to_string (index), + index, + WIFI_MOD_CLASS_VHT); } WifiCodeRate diff --git a/src/wifi/model/vht-phy.h b/src/wifi/model/vht-phy.h index e5b299992..4ce2f68ea 100644 --- a/src/wifi/model/vht-phy.h +++ b/src/wifi/model/vht-phy.h @@ -316,6 +316,16 @@ private: // Inherited virtual void BuildModeList (void) override; + /** + * Return the VHT MCS corresponding to + * the provided index. + * This method binds all the callbacks used by WifiMode. + * + * \param index the index of the MCS + * \return a VHT MCS + */ + static WifiMode CreateVhtMcs (uint8_t index); + /** * Typedef for storing exceptions in the number of BCC encoders for VHT MCSs */