diff --git a/src/lte/model/eps-bearer.cc b/src/lte/model/eps-bearer.cc index 9949e349c..ba055ceb5 100644 --- a/src/lte/model/eps-bearer.cc +++ b/src/lte/model/eps-bearer.cc @@ -52,7 +52,7 @@ EpsBearer::GetTypeId() .AddConstructor() .AddAttribute( "Release", - "Change from 11 to 15 if you need bearer definition as per Release 15." + "Change from 11 to 18 if you need bearer definition as per newer Releases." " Reference document: TS 23.203. The change does not impact other LTE code than " " bearers definition.", UintegerValue(11), @@ -111,9 +111,13 @@ EpsBearer::SetRelease(uint8_t release) case 15: m_requirements = GetRequirementsRel15(); break; + case 18: + m_requirements = GetRequirementsRel18(); + break; default: NS_FATAL_ERROR("Not recognized release " << static_cast(release) - << " please use a value between 8 and 11, or 15"); + << " please choose a value between" + " 8 and 11, or 15 or 18"); } m_release = release; } @@ -121,28 +125,28 @@ EpsBearer::SetRelease(uint8_t release) uint8_t EpsBearer::GetResourceType() const { - return GetResourceType(*m_requirements, qci); + return GetResourceType(m_requirements, qci); } uint8_t EpsBearer::GetPriority() const { - return GetPriority(*m_requirements, qci); + return GetPriority(m_requirements, qci); } uint16_t EpsBearer::GetPacketDelayBudgetMs() const { - return GetPacketDelayBudgetMs(*m_requirements, qci); + return GetPacketDelayBudgetMs(m_requirements, qci); } double EpsBearer::GetPacketErrorLossRate() const { - return GetPacketErrorLossRate(*m_requirements, qci); + return GetPacketErrorLossRate(m_requirements, qci); } -EpsBearer::BearerRequirementsMap* +const EpsBearer::BearerRequirementsMap& EpsBearer::GetRequirementsRel11() { /* Needed to support GCC 4.9. Otherwise, use list constructors, for example: @@ -156,66 +160,88 @@ EpsBearer::GetRequirementsRel11() * }; * } */ - static EpsBearer::BearerRequirementsMap ret; - - if (ret.empty()) - { - ret.insert(std::make_pair(GBR_CONV_VOICE, std::make_tuple(1, 2, 100, 1.0e-2, 0, 0))); - ret.insert(std::make_pair(GBR_CONV_VIDEO, std::make_tuple(1, 4, 150, 1.0e-3, 0, 0))); - ret.insert(std::make_pair(GBR_GAMING, std::make_tuple(1, 3, 50, 1.0e-3, 0, 0))); - ret.insert(std::make_pair(GBR_NON_CONV_VIDEO, std::make_tuple(1, 5, 300, 1.0e-6, 0, 0))); - ret.insert(std::make_pair(NGBR_IMS, std::make_tuple(0, 1, 100, 1.0e-6, 0, 0))); - ret.insert( - std::make_pair(NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 6, 300, 1.0e-6, 0, 0))); - ret.insert( - std::make_pair(NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 7, 100, 1.0e-3, 0, 0))); - ret.insert( - std::make_pair(NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 8, 300, 1.0e-6, 0, 0))); - ret.insert( - std::make_pair(NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 9, 300, 1.0e-6, 0, 0))); - } - return &ret; + static EpsBearer::BearerRequirementsMap ret{ + {GBR_CONV_VOICE, std::make_tuple(1, 2, 100, 1.0e-2, 0, 0)}, + {GBR_CONV_VIDEO, std::make_tuple(1, 4, 150, 1.0e-3, 0, 0)}, + {GBR_GAMING, std::make_tuple(1, 3, 50, 1.0e-3, 0, 0)}, + {GBR_NON_CONV_VIDEO, std::make_tuple(1, 5, 300, 1.0e-6, 0, 0)}, + {NGBR_IMS, std::make_tuple(0, 1, 100, 1.0e-6, 0, 0)}, + {NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 6, 300, 1.0e-6, 0, 0)}, + {NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 7, 100, 1.0e-3, 0, 0)}, + {NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 8, 300, 1.0e-6, 0, 0)}, + {NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 9, 300, 1.0e-6, 0, 0)}, + }; + return ret; } -EpsBearer::BearerRequirementsMap* +const EpsBearer::BearerRequirementsMap& EpsBearer::GetRequirementsRel15() { // Needed to support GCC 4.9. Otherwise, use list constructors (see GetRequirementsRel10) - static EpsBearer::BearerRequirementsMap ret; + static EpsBearer::BearerRequirementsMap ret{ + {GBR_CONV_VOICE, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)}, + {GBR_CONV_VIDEO, std::make_tuple(1, 40, 150, 1.0e-3, 0, 2000)}, + {GBR_GAMING, std::make_tuple(1, 30, 50, 1.0e-3, 0, 2000)}, + {GBR_NON_CONV_VIDEO, std::make_tuple(1, 50, 300, 1.0e-6, 0, 2000)}, + {GBR_MC_PUSH_TO_TALK, std::make_tuple(1, 7, 75, 1.0e-2, 0, 2000)}, + {GBR_NMC_PUSH_TO_TALK, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)}, + {GBR_MC_VIDEO, std::make_tuple(1, 15, 100, 1.0e-3, 0, 2000)}, + {GBR_V2X, std::make_tuple(1, 25, 50, 1.0e-2, 0, 2000)}, + {NGBR_IMS, std::make_tuple(0, 10, 100, 1.0e-6, 0, 0)}, + {NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 60, 300, 1.0e-6, 0, 0)}, + {NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 70, 100, 1.0e-3, 0, 0)}, + {NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 80, 300, 1.0e-6, 0, 0)}, + {NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 90, 300, 1.0e-6, 0, 0)}, + {NGBR_MC_DELAY_SIGNAL, std::make_tuple(0, 5, 60, 1.0e-6, 0, 0)}, + {NGBR_MC_DATA, std::make_tuple(0, 55, 200, 1.0e-6, 0, 0)}, + {NGBR_V2X, std::make_tuple(0, 65, 5, 1.0e-2, 0, 0)}, + {NGBR_LOW_LAT_EMBB, std::make_tuple(0, 68, 10, 1.0e-6, 0, 0)}, + {DGBR_DISCRETE_AUT_SMALL, std::make_tuple(2, 19, 10, 1.0e-4, 255, 2000)}, + {DGBR_DISCRETE_AUT_LARGE, std::make_tuple(2, 22, 10, 1.0e-4, 1358, 2000)}, + {DGBR_ITS, std::make_tuple(2, 24, 30, 1.0e-5, 1354, 2000)}, + {DGBR_ELECTRICITY, std::make_tuple(2, 21, 5, 1.0e-5, 255, 2000)}, + }; + return ret; +} - if (ret.empty()) - { - ret.insert(std::make_pair(GBR_CONV_VOICE, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000))); - ret.insert(std::make_pair(GBR_CONV_VIDEO, std::make_tuple(1, 40, 150, 1.0e-3, 0, 2000))); - ret.insert(std::make_pair(GBR_GAMING, std::make_tuple(1, 30, 50, 1.0e-3, 0, 2000))); - ret.insert( - std::make_pair(GBR_NON_CONV_VIDEO, std::make_tuple(1, 50, 300, 1.0e-6, 0, 2000))); - ret.insert(std::make_pair(GBR_MC_PUSH_TO_TALK, std::make_tuple(1, 7, 75, 1.0e-2, 0, 2000))); - ret.insert( - std::make_pair(GBR_NMC_PUSH_TO_TALK, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000))); - ret.insert(std::make_pair(GBR_MC_VIDEO, std::make_tuple(1, 15, 100, 1.0e-3, 0, 2000))); - ret.insert(std::make_pair(GBR_V2X, std::make_tuple(1, 25, 50, 1.0e-2, 0, 2000))); - ret.insert(std::make_pair(NGBR_IMS, std::make_tuple(0, 10, 100, 1.0e-6, 0, 0))); - ret.insert( - std::make_pair(NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 60, 300, 1.0e-6, 0, 0))); - ret.insert( - std::make_pair(NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 70, 100, 1.0e-3, 0, 0))); - ret.insert( - std::make_pair(NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 80, 300, 1.0e-6, 0, 0))); - ret.insert( - std::make_pair(NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 90, 300, 1.0e-6, 0, 0))); - ret.insert(std::make_pair(NGBR_MC_DELAY_SIGNAL, std::make_tuple(0, 5, 60, 1.0e-6, 0, 0))); - ret.insert(std::make_pair(NGBR_MC_DATA, std::make_tuple(0, 55, 200, 1.0e-6, 0, 0))); - ret.insert(std::make_pair(NGBR_V2X, std::make_tuple(0, 65, 5, 1.0e-2, 0, 0))); - ret.insert(std::make_pair(NGBR_LOW_LAT_EMBB, std::make_tuple(0, 68, 10, 1.0e-6, 0, 0))); - ret.insert( - std::make_pair(DGBR_DISCRETE_AUT_SMALL, std::make_tuple(2, 19, 10, 1.0e-4, 255, 2000))); - ret.insert(std::make_pair(DGBR_DISCRETE_AUT_LARGE, - std::make_tuple(2, 22, 10, 1.0e-4, 1358, 2000))); - ret.insert(std::make_pair(DGBR_ITS, std::make_tuple(2, 24, 30, 1.0e-5, 1354, 2000))); - ret.insert(std::make_pair(DGBR_ELECTRICITY, std::make_tuple(2, 21, 5, 1.0e-5, 255, 2000))); - } - return &ret; +const EpsBearer::BearerRequirementsMap& +EpsBearer::GetRequirementsRel18() +{ + // Needed to support GCC 4.9. Otherwise, use list constructors (see GetRequirementsRel10) + static EpsBearer::BearerRequirementsMap ret{ + {GBR_CONV_VOICE, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)}, + {GBR_CONV_VIDEO, std::make_tuple(1, 40, 150, 1.0e-3, 0, 2000)}, + {GBR_GAMING, std::make_tuple(1, 30, 50, 1.0e-3, 0, 2000)}, + {GBR_NON_CONV_VIDEO, std::make_tuple(1, 50, 300, 1.0e-6, 0, 2000)}, + {GBR_MC_PUSH_TO_TALK, std::make_tuple(1, 7, 75, 1.0e-2, 0, 2000)}, + {GBR_NMC_PUSH_TO_TALK, std::make_tuple(1, 20, 100, 1.0e-2, 0, 2000)}, + {GBR_MC_VIDEO, std::make_tuple(1, 15, 100, 1.0e-3, 0, 2000)}, + {GBR_V2X, std::make_tuple(1, 25, 50, 1.0e-2, 0, 2000)}, + {NGBR_IMS, std::make_tuple(0, 10, 100, 1.0e-6, 0, 0)}, + {NGBR_VIDEO_TCP_OPERATOR, std::make_tuple(0, 60, 300, 1.0e-6, 0, 0)}, + {NGBR_VOICE_VIDEO_GAMING, std::make_tuple(0, 70, 100, 1.0e-3, 0, 0)}, + {NGBR_VIDEO_TCP_PREMIUM, std::make_tuple(0, 80, 300, 1.0e-6, 0, 0)}, + {NGBR_VIDEO_TCP_DEFAULT, std::make_tuple(0, 90, 300, 1.0e-6, 0, 0)}, + {NGBR_MC_DELAY_SIGNAL, std::make_tuple(0, 5, 60, 1.0e-6, 0, 0)}, + {NGBR_MC_DATA, std::make_tuple(0, 55, 200, 1.0e-6, 0, 0)}, + {NGBR_V2X, std::make_tuple(0, 65, 5, 1.0e-2, 0, 0)}, + {NGBR_LOW_LAT_EMBB, std::make_tuple(0, 68, 10, 1.0e-6, 0, 0)}, + {GBR_LIVE_UL_71, std::make_tuple(1, 56, 150, 1.0e-6, 0, 0)}, + {GBR_LIVE_UL_72, std::make_tuple(1, 56, 300, 1.0e-4, 0, 0)}, + {GBR_LIVE_UL_73, std::make_tuple(1, 56, 300, 1.0e-8, 0, 0)}, + {GBR_LIVE_UL_74, std::make_tuple(1, 56, 500, 1.0e-8, 0, 0)}, + {GBR_LIVE_UL_76, std::make_tuple(1, 56, 500, 1.0e-4, 0, 0)}, + {DGBR_DISCRETE_AUT_SMALL, std::make_tuple(2, 19, 10, 1.0e-4, 255, 2000)}, + {DGBR_DISCRETE_AUT_LARGE, std::make_tuple(2, 22, 10, 1.0e-4, 1358, 2000)}, + {DGBR_ITS, std::make_tuple(2, 24, 30, 1.0e-5, 1354, 2000)}, + {DGBR_ELECTRICITY, std::make_tuple(2, 21, 5, 1.0e-5, 255, 2000)}, + {DGBR_V2X, std::make_tuple(2, 18, 5, 1.0e-4, 1354, 2000)}, + {DGBR_INTER_SERV_87, std::make_tuple(2, 25, 5, 1.0e-3, 500, 2000)}, + {DGBR_INTER_SERV_88, std::make_tuple(2, 25, 10, 1.0e-3, 1125, 2000)}, + {DGBR_VISUAL_CONTENT_89, std::make_tuple(2, 25, 15, 1.0e-4, 17000, 2000)}, + {DGBR_VISUAL_CONTENT_90, std::make_tuple(2, 25, 20, 1.0e-4, 63000, 2000)}, + }; + return ret; } } // namespace ns3 diff --git a/src/lte/model/eps-bearer.h b/src/lte/model/eps-bearer.h index f6d87e671..608c3ac5f 100644 --- a/src/lte/model/eps-bearer.h +++ b/src/lte/model/eps-bearer.h @@ -79,10 +79,10 @@ struct AllocationRetentionPriority * * Please note that from Release 8 (the latest when the LENA project finished) * to Release 11, the bearers ID and requirements are the same. From Release 12, - * they started to change, and the latest version is now Release 15. However, - * we do not support intermediate types: in other words, you can select from - * Release 8 to Release 11, or Release 15. Any other value will result in a - * program crash. + * they started to change, and the latest version is now Release 18. However, + * we do not support intermediate types between releases 11 and 15: in other words, + * you can select from Release 8 to Release 11, or Release 15 or 18. + * Any other value will result in a program crash. * * The release version only affect Bearer definitions. Other part of the LTE * module are not affected when changing the Release attribute. @@ -100,7 +100,7 @@ class EpsBearer : public ObjectBase /** * QoS Class Indicator. See 3GPP 23.203 Section 6.1.7.2 for standard values. - * Updated to Release 15. + * Updated to Release 18. */ enum Qci : uint8_t { @@ -112,6 +112,11 @@ class EpsBearer : public ObjectBase GBR_NMC_PUSH_TO_TALK = 66, ///< GBR Non-Mission-Critical User Plane Push To Talk voice GBR_MC_VIDEO = 67, ///< GBR Mission Critical Video User Plane GBR_V2X = 75, ///< GBR V2X Messages + GBR_LIVE_UL_71 = 71, ///< GBR Live UL streaming + GBR_LIVE_UL_72 = 72, ///< GBR Live UL streaming + GBR_LIVE_UL_73 = 73, ///< GBR Live UL streaming + GBR_LIVE_UL_74 = 74, ///< GBR Live UL streaming + GBR_LIVE_UL_76 = 76, ///< GBR Live UL streaming NGBR_IMS = 5, ///< Non-GBR IMS Signalling NGBR_VIDEO_TCP_OPERATOR = 6, ///< Non-GBR TCP-based Video (Buffered Streaming, e.g., www, e-mail...) @@ -131,7 +136,16 @@ class EpsBearer : public ObjectBase 83, ///< Delay-Critical GBR Discrete Automation Large Packets (TS 22.261) DGBR_ITS = 84, ///< Delay-Critical GBR Intelligent Transport Systems (TS 22.261) DGBR_ELECTRICITY = - 85, ///< Delay-Critical GBR Electricity Distribution High Voltage (TS 22.261) + 85, ///< Delay-Critical GBR Electricity Distribution High Voltage (TS 22.261) + DGBR_V2X = 86, ///< Delay-Critical GBR V2X Messages (TS 23.501) + DGBR_INTER_SERV_87 = + 87, ///< Delay-Critical GBR Interactive Service - Motion tracking data (TS 23.501) + DGBR_INTER_SERV_88 = + 88, ///< Delay-Critical GBR Interactive Service - Motion tracking data (TS 23.501) + DGBR_VISUAL_CONTENT_89 = + 89, ///< Delay-Critical GBR Visual Content for cloud/edge/split rendering (TS 23.501) + DGBR_VISUAL_CONTENT_90 = + 90, ///< Delay-Critical GBR Visual Content for cloud/edge/split rendering (TS 23.501) }; Qci qci; ///< Qos class indicator @@ -335,7 +349,7 @@ class EpsBearer : public ObjectBase * * To be revisited when GCC 4.9 will not be supported anymore. */ - static BearerRequirementsMap* GetRequirementsRel11(); + static const BearerRequirementsMap& GetRequirementsRel11(); /** * \brief Retrieve requirements for Rel. 15 @@ -348,16 +362,22 @@ class EpsBearer : public ObjectBase * * To be revisited when GCC 4.9 will not be supported anymore. */ - static BearerRequirementsMap* GetRequirementsRel15(); + static const BearerRequirementsMap& GetRequirementsRel15(); + + /** + * \brief Retrieve requirements for Rel. 18 + * \return the BearerRequirementsMap for Release 18 + */ + static const BearerRequirementsMap& GetRequirementsRel18(); /** * \brief Requirements pointer per bearer * * It will point to a static map. */ - BearerRequirementsMap* m_requirements; + BearerRequirementsMap m_requirements; - uint8_t m_release{30}; //!< Release (10 or 15) + uint8_t m_release{30}; //!< Release (10 or 15 or 18) }; } // namespace ns3