42 Time slotPeriod)
const
44 NS_LOG_FUNCTION(
this);
48 std::vector<NrMacSchedulerLcAlgorithm::Assignation> ret;
50 NS_LOG_INFO(
"To distribute: " << tbs <<
" bytes over " << ueLCG.size() <<
" LCG"
53 uint32_t bytesLeftToBeAssigned = tbs;
54 uint32_t bytesAssigned = 0;
55 uint64_t sumErabGueanteedBitRate = 0;
57 std::vector<std::pair<uint8_t, uint8_t>>
59 std::vector<std::pair<uint8_t, uint8_t>>
62 std::vector<std::pair<uint8_t, uint32_t>>
63 AssignedBytesToGbrLCsList;
66 for (
const auto& lcg : ueLCG)
68 std::vector<uint8_t> ueActiveLCs = GetLCG(lcg)->GetActiveLCIds();
69 for (
const auto lcId : ueActiveLCs)
71 if ((GetLCG(lcg)->GetLC(lcId)->m_resourceType ==
72 nr::LogicalChannelConfigListElement_s::QBT_DGBR ||
73 GetLCG(lcg)->GetLC(lcId)->m_resourceType ==
74 nr::LogicalChannelConfigListElement_s::QBT_GBR) &&
75 GetLCG(lcg)->GetLC(lcId)->m_eRabGuaranteedBitrateDl != UINT64_MAX)
77 gbrActiveLCs.emplace_back(GetLCGID(lcg), lcId);
78 sumErabGueanteedBitRate +=
79 (GetLCG(lcg)->GetLC(lcId)->m_eRabGuaranteedBitrateDl / 8);
81 restActiveLCs.emplace_back(GetLCGID(lcg), lcId);
85 if (gbrActiveLCs.size() > 1 && sumErabGueanteedBitRate >= tbs)
87 uint32_t bytesPerLcGbr;
89 if (bytesLeftToBeAssigned > 0)
91 NS_ASSERT(!gbrActiveLCs.empty());
92 bytesPerLcGbr = bytesLeftToBeAssigned / gbrActiveLCs.size();
94 for (
const auto& lcg : ueLCG)
96 for (
auto& itGbrActiveLCs : gbrActiveLCs)
98 if (itGbrActiveLCs.first == GetLCGID(lcg))
100 AssignedBytesToGbrLCsList.emplace_back(itGbrActiveLCs.second,
105 bytesLeftToBeAssigned = 0;
108 else if (!gbrActiveLCs.empty())
110 for (
const auto& lcg : ueLCG)
112 for (
auto& itGbrActiveLCs : gbrActiveLCs)
114 if (itGbrActiveLCs.first == GetLCGID(lcg))
117 GetLCG(lcg)->GetLC(itGbrActiveLCs.second)->m_eRabGuaranteedBitrateDl !=
119 "LC is not guaranteed bit rate!");
121 uint32_t bytes = std::min(
122 static_cast<uint32_t
>(
123 slotPeriod.GetSeconds() *
124 (GetLCG(lcg)->GetLC(itGbrActiveLCs.second)->m_eRabGuaranteedBitrateDl /
126 GetLCG(lcg)->GetLC(itGbrActiveLCs.second)->GetTotalSize());
128 bytesAssigned = bytes >= bytesLeftToBeAssigned ? bytesLeftToBeAssigned : bytes;
130 AssignedBytesToGbrLCsList.emplace_back(itGbrActiveLCs.second, bytesAssigned);
132 NS_ASSERT(bytesLeftToBeAssigned >= bytesAssigned);
133 bytesLeftToBeAssigned -= bytesAssigned;
141 if (!restActiveLCs.empty() && bytesLeftToBeAssigned > 0)
143 NS_ASSERT(!restActiveLCs.empty());
144 bytesPerLc = bytesLeftToBeAssigned / restActiveLCs.size();
146 for (
const auto& lcg : ueLCG)
148 for (
auto& itRestActiveLCs : restActiveLCs)
150 if (itRestActiveLCs.first == GetLCGID(lcg))
152 bool erabGbrTrue =
false;
154 for (
auto& it : AssignedBytesToGbrLCsList)
156 if (it.first == itRestActiveLCs.second && GetLCGID(lcg) == 1)
158 it.second += bytesPerLc;
166 NS_LOG_DEBUG(
"LC : " << +itRestActiveLCs.second
167 <<
" bytes: " << bytesPerLc);
168 ret.emplace_back(GetLCGID(lcg), itRestActiveLCs.second, bytesPerLc);
175 for (
auto& it : AssignedBytesToGbrLCsList)
177 NS_LOG_DEBUG(
"LC : " << +it.first <<
" bytes: " << it.second);
178 ret.emplace_back(1, it.first, it.second);
188 NS_LOG_FUNCTION(
this);
192 std::vector<NrMacSchedulerLcAlgorithm::Assignation> ret;
194 uint32_t activeLc = 0;
195 for (
const auto& lcg : ueLCG)
197 std::vector<uint8_t> lcs = GetLCG(lcg)->GetLCId();
198 for (
const auto& lcId : lcs)
200 if (GetLCG(lcg)->GetTotalSizeOfLC(lcId) > 0)
212 uint32_t amountPerLC = tbs / activeLc;
213 NS_LOG_INFO(
"Total LC: " << activeLc <<
" each one will receive " << amountPerLC <<
" bytes");
215 for (
const auto& lcg : ueLCG)
217 std::vector<uint8_t> lcs = GetLCG(lcg)->GetLCId();
218 for (
const auto& lcId : lcs)
220 if (GetLCG(lcg)->GetTotalSizeOfLC(lcId) > 0)
222 NS_LOG_INFO(
"Assigned to LCID " <<
static_cast<uint32_t
>(lcId) <<
" inside LCG "
223 <<
static_cast<uint32_t
>(GetLCGID(lcg))
224 <<
" an amount of " << amountPerLC <<
" B");
225 ret.emplace_back(GetLCGID(lcg), lcId, amountPerLC);