A Discrete-Event Network Simulator
API
lte-test-cqi-generation.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014 Piotr Gawlowicz
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Piotr Gawlowicz <gawlowicz.p@gmail.com>
19  *
20  */
21 
22 #include <ns3/simulator.h>
23 #include <ns3/log.h>
24 #include <ns3/callback.h>
25 #include <ns3/config.h>
26 #include <ns3/string.h>
27 #include <ns3/double.h>
28 #include <ns3/enum.h>
29 #include <ns3/boolean.h>
30 #include <ns3/pointer.h>
31 #include "ns3/ff-mac-scheduler.h"
32 #include "ns3/mobility-helper.h"
33 #include "ns3/lte-helper.h"
34 
35 #include "lte-ffr-simple.h"
36 #include "ns3/lte-rrc-sap.h"
37 
39 
40 using namespace ns3;
41 
42 NS_LOG_COMPONENT_DEFINE ("LteCqiGenerationTest");
43 
44 void
46 {
47  testcase->DlScheduling (dlInfo);
48 }
49 
50 void
52  uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
53  uint8_t mcs, uint16_t sizeTb, uint8_t ccId)
54 {
55  testcase->UlScheduling (frameNo, subframeNo, rnti, mcs, sizeTb);
56 }
57 
58 void
61 {
62  testcase->DlScheduling (dlInfo);
63 }
64 
65 void
67  uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
68  uint8_t mcs, uint16_t sizeTb, uint8_t componentCarrierId)
69 {
70  testcase->UlScheduling (frameNo, subframeNo, rnti, mcs, sizeTb);
71 }
72 
73 
79  : TestSuite ("lte-cqi-generation", SYSTEM)
80 {
81 // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_DEBUG);
82 // LogComponentEnable ("LteCqiGenerationTest", logLevel);
83  NS_LOG_INFO ("Creating LteCqiGenerationTestSuite");
84 
85  AddTestCase (new LteCqiGenerationTestCase ("UsePdcchForCqiGeneration", false, 4, 2), TestCase::QUICK);
86  AddTestCase (new LteCqiGenerationTestCase ("UsePdschForCqiGeneration", true, 28, 2), TestCase::QUICK);
87 
88  AddTestCase (new LteCqiGenerationDlPowerControlTestCase ("CqiGenerationWithDlPowerControl",
89  LteRrcSap::PdschConfigDedicated::dB0, LteRrcSap::PdschConfigDedicated::dB0, 4, 2), TestCase::QUICK);
90  AddTestCase (new LteCqiGenerationDlPowerControlTestCase ("CqiGenerationWithDlPowerControl",
91  LteRrcSap::PdschConfigDedicated::dB0, LteRrcSap::PdschConfigDedicated::dB_3, 8, 2), TestCase::QUICK);
92  AddTestCase (new LteCqiGenerationDlPowerControlTestCase ("CqiGenerationWithDlPowerControl",
93  LteRrcSap::PdschConfigDedicated::dB0, LteRrcSap::PdschConfigDedicated::dB_6, 10, 2), TestCase::QUICK);
94  AddTestCase (new LteCqiGenerationDlPowerControlTestCase ("CqiGenerationWithDlPowerControl",
95  LteRrcSap::PdschConfigDedicated::dB1, LteRrcSap::PdschConfigDedicated::dB_6, 12, 2), TestCase::QUICK);
96  AddTestCase (new LteCqiGenerationDlPowerControlTestCase ("CqiGenerationWithDlPowerControl",
97  LteRrcSap::PdschConfigDedicated::dB2, LteRrcSap::PdschConfigDedicated::dB_6, 14, 2), TestCase::QUICK);
98  AddTestCase (new LteCqiGenerationDlPowerControlTestCase ("CqiGenerationWithDlPowerControl",
99  LteRrcSap::PdschConfigDedicated::dB3, LteRrcSap::PdschConfigDedicated::dB_6, 14, 2), TestCase::QUICK);
100  AddTestCase (new LteCqiGenerationDlPowerControlTestCase ("CqiGenerationWithDlPowerControl",
101  LteRrcSap::PdschConfigDedicated::dB3, LteRrcSap::PdschConfigDedicated::dB0, 8, 2), TestCase::QUICK);
102 }
103 
105 
106 
107 LteCqiGenerationTestCase::LteCqiGenerationTestCase (std::string name, bool usePdcchForCqiGeneration,
108  uint16_t dlMcs, uint16_t ulMcs)
109  : TestCase ("Downlink Power Control: " + name),
110  m_dlMcs (dlMcs),
111  m_ulMcs (ulMcs)
112 {
113  m_usePdschForCqiGeneration = usePdcchForCqiGeneration;
114  NS_LOG_INFO ("Creating LteCqiGenerationTestCase");
115 }
116 
118 {
119 }
120 
121 void
123 {
124  // need to allow for RRC connection establishment + CQI feedback reception
125  if (Simulator::Now () > MilliSeconds (35))
126  {
127 // NS_LOG_UNCOND("DL MSC: " << (uint32_t)mcsTb1 << " expected DL MCS: " << (uint32_t)m_dlMcs);
128  NS_TEST_ASSERT_MSG_EQ ((uint32_t)dlInfo.mcsTb1, (uint32_t)m_dlMcs, "Wrong DL MCS ");
129  }
130 }
131 
132 void
133 LteCqiGenerationTestCase::UlScheduling (uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
134  uint8_t mcs, uint16_t sizeTb)
135 {
136  // need to allow for RRC connection establishment + SRS transmission
137  if (Simulator::Now () > MilliSeconds (50))
138  {
139 // NS_LOG_UNCOND("UL MSC: " << (uint32_t)mcs << " expected UL MCS: " << (uint32_t)m_ulMcs);
140  NS_TEST_ASSERT_MSG_EQ ((uint32_t)mcs, (uint32_t)m_ulMcs, "Wrong UL MCS");
141  }
142 }
143 
144 void
146 {
147  NS_LOG_DEBUG ("LteCqiGenerationTestCase");
148 
149  Config::Reset ();
150  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
151  Config::SetDefault ("ns3::LteHelper::UsePdschForCqiGeneration", BooleanValue (m_usePdschForCqiGeneration));
152 
153  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (true));
154  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (true));
155 
156  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
157 
158  // Create Nodes: eNodeB and UE
159  NodeContainer enbNodes;
160  NodeContainer ueNodes1;
161  NodeContainer ueNodes2;
162  enbNodes.Create (2);
163  ueNodes1.Create (1);
164  ueNodes2.Create (1);
165  NodeContainer allNodes = NodeContainer ( enbNodes, ueNodes1, ueNodes2);
166 
167  /*
168  * The topology is the following:
169  *
170  * eNB1 UE1 UE2 eNB2
171  * | | |
172  * x -------------------------- x -------------------------- x
173  * 500 m 500 m
174  *
175  */
176 
177  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
178  positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // eNB1
179  positionAlloc->Add (Vector (1000, 0.0, 0.0)); // eNB2
180  positionAlloc->Add (Vector (500.0, 0.0, 0.0)); // UE1
181  positionAlloc->Add (Vector (500, 0.0, 0.0)); // UE2
183  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
184  mobility.SetPositionAllocator (positionAlloc);
185  mobility.Install (allNodes);
186 
187  // Create Devices and install them in the Nodes (eNB and UE)
188  NetDeviceContainer enbDevs;
189  NetDeviceContainer ueDevs1;
190  NetDeviceContainer ueDevs2;
191  lteHelper->SetSchedulerType ("ns3::PfFfMacScheduler");
192  lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
193 
194  lteHelper->SetFfrAlgorithmType ("ns3::LteFrHardAlgorithm");
195 
196  lteHelper->SetFfrAlgorithmAttribute ("DlSubBandOffset", UintegerValue (0));
197  lteHelper->SetFfrAlgorithmAttribute ("DlSubBandwidth", UintegerValue (12));
198  lteHelper->SetFfrAlgorithmAttribute ("UlSubBandOffset", UintegerValue (0));
199  lteHelper->SetFfrAlgorithmAttribute ("UlSubBandwidth", UintegerValue (25));
200  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (0)));
201 
202  lteHelper->SetFfrAlgorithmAttribute ("DlSubBandOffset", UintegerValue (12));
203  lteHelper->SetFfrAlgorithmAttribute ("DlSubBandwidth", UintegerValue (12));
204  lteHelper->SetFfrAlgorithmAttribute ("UlSubBandOffset", UintegerValue (0));
205  lteHelper->SetFfrAlgorithmAttribute ("UlSubBandwidth", UintegerValue (25));
206  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (1)));
207 
208  ueDevs1 = lteHelper->InstallUeDevice (ueNodes1);
209  ueDevs2 = lteHelper->InstallUeDevice (ueNodes2);
210 
211  // Attach a UE to a eNB
212  lteHelper->Attach (ueDevs1, enbDevs.Get (0));
213  lteHelper->Attach (ueDevs2, enbDevs.Get (1));
214 
215  // Activate an EPS bearer
216  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
217  EpsBearer bearer (q);
218  lteHelper->ActivateDataRadioBearer (ueDevs1, bearer);
219  lteHelper->ActivateDataRadioBearer (ueDevs2, bearer);
220 
221  Config::Connect ("/NodeList/0/DeviceList/0/ComponentCarrierMap/*/LteEnbMac/DlScheduling",
223 
224  Config::Connect ("/NodeList/0/DeviceList/0/ComponentCarrierMap/*/LteEnbMac/UlScheduling",
226 
227  Config::Connect ("/NodeList/1/DeviceList/0/ComponentCarrierMap/*/LteEnbMac/DlScheduling",
229 
230  Config::Connect ("/NodeList/1/DeviceList/0/ComponentCarrierMap/*/LteEnbMac/UlScheduling",
232 
233  Simulator::Stop (Seconds (1.100));
234  Simulator::Run ();
235 
236  Simulator::Destroy ();
237 }
238 
240  uint8_t cell0Pa, uint8_t cell1Pa, uint16_t dlMcs, uint16_t ulMcs)
241  : TestCase ("Downlink Power Control: " + name),
242  m_cell0Pa (cell0Pa),
243  m_cell1Pa (cell1Pa),
244  m_dlMcs (dlMcs),
245  m_ulMcs (ulMcs)
246 {
247  NS_LOG_INFO ("Creating LteCqiGenerationTestCase");
248 }
249 
251 {
252 }
253 
254 void
256 {
257  // need to allow for RRC connection establishment + CQI feedback reception
258  if (Simulator::Now () > MilliSeconds (500))
259  {
260 // NS_LOG_UNCOND("DL MSC: " << (uint32_t)mcsTb1 << " expected DL MCS: " << (uint32_t)m_dlMcs);
261  NS_TEST_ASSERT_MSG_EQ ((uint32_t)dlInfo.mcsTb1, (uint32_t)m_dlMcs, "Wrong DL MCS ");
262  }
263 }
264 
265 void
266 LteCqiGenerationDlPowerControlTestCase::UlScheduling (uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
267  uint8_t mcs, uint16_t sizeTb)
268 {
269  // need to allow for RRC connection establishment + SRS transmission
270  if (Simulator::Now () > MilliSeconds (500))
271  {
272 // NS_LOG_UNCOND("UL MSC: " << (uint32_t)mcs << " expected UL MCS: " << (uint32_t)m_ulMcs);
273  NS_TEST_ASSERT_MSG_EQ ((uint32_t)mcs, (uint32_t)m_ulMcs, "Wrong UL MCS");
274  }
275 }
276 
277 void
279 {
280  NS_LOG_DEBUG ("LteCqiGenerationTestCase");
281 
282  Config::Reset ();
283  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
284  Config::SetDefault ("ns3::LteHelper::UsePdschForCqiGeneration", BooleanValue (true));
285 
286  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (true));
287  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (true));
288 
289  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
290  lteHelper->SetFfrAlgorithmType ("ns3::LteFfrSimple");
291 
292  // Create Nodes: eNodeB and UE
293  NodeContainer enbNodes;
294  NodeContainer ueNodes1;
295  NodeContainer ueNodes2;
296  enbNodes.Create (2);
297  ueNodes1.Create (1);
298  ueNodes2.Create (2);
299  NodeContainer allNodes = NodeContainer ( enbNodes, ueNodes1, ueNodes2);
300 
301  /*
302  * The topology is the following:
303  *
304  * eNB1 UE1 UE2 eNB2 UE3
305  * | | | |
306  * x -------------------------- x -------------------------- x----x
307  * 500 m 500 m 50m
308  *
309  * see https://www.nsnam.org/bugzilla/show_bug.cgi?id=2048#c4 for why we need UE3
310  */
311 
312  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
313  positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // eNB1
314  positionAlloc->Add (Vector (1000, 0.0, 0.0)); // eNB2
315  positionAlloc->Add (Vector (500.0, 0.0, 0.0)); // UE1
316  positionAlloc->Add (Vector (500, 0.0, 0.0)); // UE2
317  positionAlloc->Add (Vector (1050, 0.0, 0.0)); // UE3
319  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
320  mobility.SetPositionAllocator (positionAlloc);
321  mobility.Install (allNodes);
322 
323  // Create Devices and install them in the Nodes (eNB and UE)
324  NetDeviceContainer enbDevs;
325  NetDeviceContainer ueDevs1;
326  NetDeviceContainer ueDevs2;
327  lteHelper->SetSchedulerType ("ns3::PfFfMacScheduler");
328  lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
329  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
330  ueDevs1 = lteHelper->InstallUeDevice (ueNodes1);
331  ueDevs2 = lteHelper->InstallUeDevice (ueNodes2);
332 
333  // Attach a UE to a eNB
334  lteHelper->Attach (ueDevs1, enbDevs.Get (0));
335  lteHelper->Attach (ueDevs2, enbDevs.Get (1));
336 
337  // Activate an EPS bearer
338  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
339  EpsBearer bearer (q);
340  lteHelper->ActivateDataRadioBearer (ueDevs1, bearer);
341  lteHelper->ActivateDataRadioBearer (ueDevs2, bearer);
342 
343  PointerValue tmp;
344  enbDevs.Get (0)->GetAttribute ("LteFfrAlgorithm", tmp);
345  Ptr<LteFfrSimple> simpleFfrAlgorithmEnb0 = DynamicCast<LteFfrSimple>(tmp.GetObject ());
346  simpleFfrAlgorithmEnb0->ChangePdschConfigDedicated (true);
347 
348  LteRrcSap::PdschConfigDedicated pdschConfigDedicatedEnb0;
349  pdschConfigDedicatedEnb0.pa = m_cell0Pa;
350  simpleFfrAlgorithmEnb0->SetPdschConfigDedicated (pdschConfigDedicatedEnb0);
351 
352  enbDevs.Get (1)->GetAttribute ("LteFfrAlgorithm", tmp);
353  Ptr<LteFfrSimple> simpleFfrAlgorithmEnb1 = DynamicCast<LteFfrSimple>(tmp.GetObject ());
354  simpleFfrAlgorithmEnb1->ChangePdschConfigDedicated (true);
355 
356  LteRrcSap::PdschConfigDedicated pdschConfigDedicatedEnb1;
357  pdschConfigDedicatedEnb1.pa = m_cell1Pa;
358  simpleFfrAlgorithmEnb1->SetPdschConfigDedicated (pdschConfigDedicatedEnb1);
359 
360 
361  Config::Connect ("/NodeList/0/DeviceList/0/ComponentCarrierMap/*/LteEnbMac/DlScheduling",
363 
364  Config::Connect ("/NodeList/0/DeviceList/0/ComponentCarrierMap/*/LteEnbMac/UlScheduling",
366 
367  Simulator::Stop (Seconds (1.100));
368  Simulator::Run ();
369 
370  Simulator::Destroy ();
371 }
372 
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
AttributeValue implementation for Boolean.
Definition: boolean.h:36
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:474
This test is very similar to LteCqiGenerationTestCase.
A suite of tests to run.
Definition: test.h:1342
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1686
void LteTestUlSchedulingCallback(LteCqiGenerationTestCase *testcase, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb, uint8_t ccId)
Ptr< Object > GetObject(void) const
Get the Object referenced by the PointerValue.
Definition: pointer.cc:55
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
Definition: lte-helper.cc:957
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1022
virtual void DoRun(void)
Implementation to actually run this TestCase.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:278
LteCqiGenerationTestCase(std::string name, bool usePdcchForCqiGeneration, uint16_t dlMcs, uint16_t ulMcs)
Constructor.
encapsulates test code
Definition: test.h:1155
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1310
void SetFfrAlgorithmType(std::string type)
Set the type of FFR algorithm to be used by eNodeB devices.
Definition: lte-helper.cc:306
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:279
mobility
Definition: third.py:101
virtual void DoRun(void)
Implementation to actually run this TestCase.
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
Hold variables of type enum.
Definition: enum.h:54
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
void ChangePdschConfigDedicated(bool change)
Callback function that is used to be connected to trace ChangePdschConfigDedicated.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Hold an unsigned integer type.
Definition: uinteger.h:44
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:293
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:168
holds a vector of ns3::NetDevice pointers
LteCqiGenerationDlPowerControlTestCase(std::string name, uint8_t cell0Pa, uint8_t cell1Pa, uint16_t dlMcs, uint16_t ulMcs)
Constructor.
void DlScheduling(DlSchedulingCallbackInfo dlInfo)
DL Scheduling function.
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:843
void UlScheduling(uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb)
UL Scheduling function.
static LteCqiGenerationTestSuite lteCqiGenerationTestSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
Hold objects of type Ptr<T>.
Definition: pointer.h:36
void UlScheduling(uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb)
UL Scheduling function.
bool m_usePdschForCqiGeneration
use PDCCH for CQI generation
This is the test case for testing different configuration of CQI generation.
void Reset(void)
Reset the initial value of every attribute as well as the value of every global to what they were bef...
Definition: config.cc:757
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:489
Helper class used to assign positions and mobility models to nodes.
void LteTestUlSchedulingCallback2(LteCqiGenerationDlPowerControlTestCase *testcase, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb, uint8_t componentCarrierId)
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:270
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1014
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:782
void LteTestDlSchedulingCallback2(LteCqiGenerationDlPowerControlTestCase *testcase, std::string path, DlSchedulingCallbackInfo dlInfo)
void SetPdschConfigDedicated(LteRrcSap::PdschConfigDedicated pdschConfigDedicated)
Set PDSCH config dedicated function.
void Add(Vector v)
Add a position to the list of positions.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:365
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
DlSchedulingCallbackInfo structure.
Definition: lte-common.h:239
PdschConfigDedicated structure.
Definition: lte-rrc-sap.h:154
void SetFfrAlgorithmAttribute(std::string n, const AttributeValue &v)
Set an attribute for the FFR algorithm to be created.
Definition: lte-helper.cc:314
void LteTestDlSchedulingCallback(LteCqiGenerationTestCase *testcase, std::string path, DlSchedulingCallbackInfo dlInfo)
Lte Cqi Generation Test Suite.
Qci
QoS Class Indicator.
Definition: eps-bearer.h:77
void DlScheduling(DlSchedulingCallbackInfo dlInfo)
DL Scheduling function.