lte: Add Release 18 QCIs

This commit is contained in:
kkoutlia
2023-02-21 15:06:08 +01:00
committed by Tom Henderson
parent 2d71ca670c
commit 1bde892f0a
2 changed files with 117 additions and 71 deletions

View File

@@ -52,7 +52,7 @@ EpsBearer::GetTypeId()
.AddConstructor<EpsBearer>()
.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<uint32_t>(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

View File

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