A Discrete-Event Network Simulator
API
lte-test-rr-ff-mac-scheduler.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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: Marco Miozzo <marco.miozzo@cttc.es>
19  * Nicola Baldo <nbaldo@cttc.es>
20  */
21 
22 #include <ns3/object.h>
23 #include <ns3/spectrum-interference.h>
24 #include <ns3/spectrum-error-model.h>
25 #include <ns3/log.h>
26 #include <ns3/test.h>
27 #include <ns3/simulator.h>
28 #include <ns3/packet.h>
29 #include <ns3/ptr.h>
30 #include <iostream>
31 #include "ns3/radio-bearer-stats-calculator.h"
32 #include <ns3/constant-position-mobility-model.h>
33 #include <ns3/eps-bearer.h>
34 #include <ns3/node-container.h>
35 #include <ns3/mobility-helper.h>
36 #include <ns3/net-device-container.h>
37 #include <ns3/lte-ue-net-device.h>
38 #include <ns3/lte-enb-net-device.h>
39 #include <ns3/lte-ue-rrc.h>
40 #include <ns3/lte-helper.h>
41 #include "ns3/string.h"
42 #include "ns3/double.h"
43 #include <ns3/lte-enb-phy.h>
44 #include <ns3/lte-ue-phy.h>
45 #include <ns3/boolean.h>
46 #include <ns3/enum.h>
47 #include <ns3/config-store-module.h>
48 
50 
51 using namespace ns3;
52 
53 NS_LOG_COMPONENT_DEFINE ("LenaTestRrFfMacScheduler");
54 
56  : TestSuite ("lte-rr-ff-mac-scheduler", SYSTEM)
57 {
58  NS_LOG_INFO ("creating LenaRrFfMacSchedulerTestCase");
59 
60  bool errorModel = true;
61 
62 
63  // DOWNLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
64  // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
65  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
66  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
67  // 9 user -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
68  // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
69  // 15 users -> 2 PRB at Itbs 26 * 0.8 -> 148 -> 148000 bytes/sec
70  // UPLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
71  // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
72  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
73  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
74  // after the patch enforcing min 3 PRBs per UE:
75  // 9 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/9 UE/TTI -> 246220 bytes/sec
76  // 12 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/12 UE/TTI -> 184670 bytes/sec
77  // 15 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/15 UE/TTI -> 147730 bytes/sec
78  AddTestCase (new LenaRrFfMacSchedulerTestCase (1,0,2196000,2292000,errorModel), TestCase::EXTENSIVE);
79  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,0,749000,749000,errorModel), TestCase::QUICK);
80  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,0,373000,373000,errorModel), TestCase::EXTENSIVE);
81  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,0,185000,246220,errorModel), TestCase::EXTENSIVE);
82  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,0,185000,184670,errorModel), TestCase::EXTENSIVE);
83  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,0,148000,147730,errorModel), TestCase::EXTENSIVE);
84 
85  // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
86  // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
87  // 3 users -> 8 PRB at Itbs 20 -> 469 -> 469000 bytes/sec
88  // 6 users -> 4 PRB at Itbs 20 -> 233 -> 233000 bytes/sec
89  // 9 user -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
90  // 12 users -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
91  // 15 users -> 2 PRB at Itbs 20 * 0.8 -> 90.4 -> 90400 bytes/sec
92  // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
93  // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
94  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
95  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
96  // after the patch enforcing min 3 PRBs per UE:
97  // 9 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/9 UE/TTI -> 82667 bytes/sec
98  // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
99  // 15 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/15 UE/TTI -> 49600 bytes/sec
100  AddTestCase (new LenaRrFfMacSchedulerTestCase (1,4800,1383000,807000,errorModel), TestCase::EXTENSIVE);
101  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,4800,469000,253000,errorModel), TestCase::EXTENSIVE);
102  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,4800,233000,125000,errorModel), TestCase::EXTENSIVE);
103  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,4800,113000,82667,errorModel), TestCase::EXTENSIVE);
104  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,4800,113000,62000,errorModel), TestCase::EXTENSIVE);
105  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,4800,90400,49600,errorModel), TestCase::EXTENSIVE);
106 
107  // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
108  // 1 user -> 24 PRB at Itbs 15 -> 1191 -> 1191000 bytes/sec
109  // 3 users -> 8 PRB at Itbs 15 -> 389 -> 389000 bytes/sec
110  // 6 users -> 4 PRB at Itbs 15 -> 193 -> 193000 bytes/sec
111  // 9 user -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
112  // 12 users -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
113  // 15 users -> 2 PRB at Itbs 15 * 0.8 -> 77.6 -> 77600 bytes/sec
114  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
115  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
116  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
117  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
118  // 9 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/9 UE/TTI -> 64889 bytes/sec
119  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
120  // 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
121  AddTestCase (new LenaRrFfMacSchedulerTestCase (1,6000,1191000,621000,errorModel), TestCase::EXTENSIVE);
122  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,6000,389000,201000,errorModel), TestCase::EXTENSIVE);
123  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,6000,193000,97000,errorModel), TestCase::EXTENSIVE);
124  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,6000,97000,64889,errorModel), TestCase::EXTENSIVE);
125  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,6000,97000,48667,errorModel), TestCase::EXTENSIVE);
126  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,6000,77600,38993,errorModel), TestCase::EXTENSIVE);
127 
128  // DOWNLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
129  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
130  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
131  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
132  // 9 user -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
133  // 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
134  // 15 users -> 2 PRB at Itbs 8 * 0.8 -> 25.6 -> 25600 bytes/sec
135  // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
136  // 1 user -> 25 PRB at Itbs 2 -> 137 -> 137000 bytes/sec
137  // 3 users -> 8 PRB at Itbs 2 -> 41 -> 41000 bytes/sec
138  // 6 users -> 4 PRB at Itbs 2 -> 22 -> 22000 bytes/sec
139  // after the patch enforcing min 3 PRBs per UE:
140  // 9 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/9 UE/TTI -> 16000 bytes/sec
141  // 12 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/12 UE/TTI -> 12000 bytes/sec
142  // 15 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/15 UE/TTI -> 9600 bytes/sec
143  AddTestCase (new LenaRrFfMacSchedulerTestCase (1,20000,421000,137000,errorModel), TestCase::EXTENSIVE);
144  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,20000,137000,41000,errorModel), TestCase::EXTENSIVE);
145  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,20000,67000,22000,errorModel), TestCase::EXTENSIVE);
146  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,20000,32000,16000,errorModel), TestCase::EXTENSIVE);
147  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,20000,32000,12000,errorModel), TestCase::EXTENSIVE);
148  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,20000,25600,9600,errorModel), TestCase::EXTENSIVE);
149 
150 }
151 
153 
154 std::string
155 LenaRrFfMacSchedulerTestCase::BuildNameString (uint16_t nUser, uint16_t dist)
156 {
157  std::ostringstream oss;
158  oss << nUser << " UEs, distance " << dist << " m";
159  return oss.str ();
160 }
161 
162 LenaRrFfMacSchedulerTestCase::LenaRrFfMacSchedulerTestCase (uint16_t nUser, uint16_t dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
163  : TestCase (BuildNameString (nUser, dist)),
164  m_nUser (nUser),
165  m_dist (dist),
166  m_thrRefDl (thrRefDl),
167  m_thrRefUl (thrRefUl),
168  m_errorModelEnabled (errorModelEnabled)
169 {
170 }
171 
173 {
174 }
175 
176 void
178 {
179  NS_LOG_FUNCTION (this << m_nUser << m_dist);
180  if (!m_errorModelEnabled)
181  {
182  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
183  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
184  }
185  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (false));
186 
187  // This is needed as the RR scheduler does not allocate resources properly for retransmission
188  Config::SetDefault ("ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough", BooleanValue (true));
189 
190  //Disable Uplink Power Control
191  Config::SetDefault ("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue (false));
192 
197  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
198 
199  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
200 
201  // Create Nodes: eNodeB and UE
202  NodeContainer enbNodes;
203  NodeContainer ueNodes;
204  enbNodes.Create (1);
205  ueNodes.Create (m_nUser);
206 
207  // Install Mobility Model
209  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
210  mobility.Install (enbNodes);
211  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
212  mobility.Install (ueNodes);
213 
214  // Create Devices and install them in the Nodes (eNB and UE)
215  NetDeviceContainer enbDevs;
216  NetDeviceContainer ueDevs;
217  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
218  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
219  ueDevs = lteHelper->InstallUeDevice (ueNodes);
220 
221  // Attach a UE to a eNB
222  lteHelper->Attach (ueDevs, enbDevs.Get (0));
223 
224  // Activate an EPS bearer
225  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
226  EpsBearer bearer (q);
227  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
228 
229 
230  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
231  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
232  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
233  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
234 
235  // Set UEs' position and power
236  for (int i = 0; i < m_nUser; i++)
237  {
239  mm->SetPosition (Vector (m_dist, 0.0, 0.0));
240  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
241  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
242  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
243  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
244  }
245 
246 
247  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
248  double statsDuration = 0.4;
249  double tolerance = 0.1;
250  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
251 
252  lteHelper->EnableRlcTraces ();
253  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
254  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
255  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
256 
257  Simulator::Run ();
258 
262  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
263  std::vector <uint64_t> dlDataRxed;
265  {
266  m_thrRefDl *= 0.95; // for couting the Vienna AMC behavior: BLER between 0% and 10%
267  }
268  for (int i = 0; i < m_nUser; i++)
269  {
270  // get the imsi
271  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
272  uint8_t lcId = 3;
273  dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
274  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t) lcId << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_thrRefDl);
275  NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, m_thrRefDl, m_thrRefDl * tolerance, " Unfair Throughput!");
276  }
277 
278  NS_LOG_INFO ("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
279  std::vector <uint64_t> ulDataRxed;
281  {
282  m_thrRefUl *= 0.95; // for couting the Vienna AMC behavior: BLER between 0% and 10%
283  }
284  for (int i = 0; i < m_nUser; i++)
285  {
286  // get the imsi
287  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
288  // get the lcId
289  uint8_t lcId = 3;
290  ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
291  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t) lcId << " bytes rxed " << (double)ulDataRxed.at (i) << " thr " << (double)ulDataRxed.at (i) / statsDuration << " ref " << m_thrRefUl << " txed " << rlcStats->GetUlTxData (imsi, lcId) / statsDuration);
292  NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, m_thrRefUl, m_thrRefUl * tolerance, " Unfair Throughput!");
293  }
294 
295  Simulator::Destroy ();
296 }
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
AttributeValue implementation for Boolean.
Definition: boolean.h:34
static std::string BuildNameString(uint16_t nUser, uint16_t dist)
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:382
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:462
Hold variables of type string.
Definition: string.h:41
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
A suite of tests to run.
Definition: test.h:1333
Ptr< LteEnbPhy > GetPhy(void) const
Mobility model for which the current position does not change once it has been set and until it is se...
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:716
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
void EnableRlcTraces(void)
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1102
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:244
encapsulates test code
Definition: test.h:1147
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1046
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:225
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
void AddTestCase(TestCase *testCase, enum TestDuration duration)
Add an individual child TestCase to this test suite.
Definition: test.cc:298
AttributeValue implementation for Time.
Definition: nstime.h:957
uint64_t GetDlRxData(uint64_t imsi, uint8_t lcid)
Gets the number of received downlink data bytes.
holds a vector of ns3::NetDevice pointers
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition: test.h:373
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void SetPosition(const Vector &position)
Ptr< RadioBearerStatsCalculator > GetRlcStats(void)
Definition: lte-helper.cc:1233
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:397
Helper class used to assign positions and mobility models to nodes.
uint64_t GetUlTxData(uint64_t imsi, uint8_t lcid)
Gets the number of transmitted uplink data bytes.
uint64_t GetUlRxData(uint64_t imsi, uint8_t lcid)
Gets the number of received uplink data bytes.
This system test program creates different test cases with a single eNB and several UEs...
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:774
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< LteUePhy > GetPhy(void) const
LenaRrFfMacSchedulerTestCase(uint16_t nUser, uint16_t dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
static LenaTestRrFfMacSchedulerSuite lenaTestRrFfMacSchedulerSuite
virtual void DoRun(void)
Implementation to actually run this TestCase.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:191
The eNodeB device implementation.
Qci
QoS Class Indicator.
Definition: eps-bearer.h:77
The LteUeNetDevice class implements the UE net device.