A Discrete-Event Network Simulator
API
lte-test-rr-ff-mac-scheduler.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Marco Miozzo <marco.miozzo@cttc.es>
18  * Nicola Baldo <nbaldo@cttc.es>
19  */
20 
22 
23 #include "ns3/double.h"
24 #include "ns3/radio-bearer-stats-calculator.h"
25 #include "ns3/string.h"
26 #include <ns3/boolean.h>
27 #include <ns3/config-store-module.h>
28 #include <ns3/constant-position-mobility-model.h>
29 #include <ns3/enum.h>
30 #include <ns3/eps-bearer.h>
31 #include <ns3/ff-mac-scheduler.h>
32 #include <ns3/log.h>
33 #include <ns3/lte-enb-net-device.h>
34 #include <ns3/lte-enb-phy.h>
35 #include <ns3/lte-helper.h>
36 #include <ns3/lte-ue-net-device.h>
37 #include <ns3/lte-ue-phy.h>
38 #include <ns3/lte-ue-rrc.h>
39 #include <ns3/mobility-helper.h>
40 #include <ns3/net-device-container.h>
41 #include <ns3/node-container.h>
42 #include <ns3/object.h>
43 #include <ns3/packet.h>
44 #include <ns3/ptr.h>
45 #include <ns3/simulator.h>
46 #include <ns3/spectrum-error-model.h>
47 #include <ns3/spectrum-interference.h>
48 #include <ns3/test.h>
49 
50 #include <iostream>
51 
52 using namespace ns3;
53 
54 NS_LOG_COMPONENT_DEFINE("LenaTestRrFfMacScheduler");
55 
57  : TestSuite("lte-rr-ff-mac-scheduler", SYSTEM)
58 {
59  NS_LOG_INFO("creating LenaRrFfMacSchedulerTestCase");
60 
61  bool errorModel = true;
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),
79  TestCase::EXTENSIVE);
80  AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 0, 749000, 749000, errorModel),
81  TestCase::QUICK);
82  AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 0, 373000, 373000, errorModel),
83  TestCase::EXTENSIVE);
84  AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 0, 185000, 246220, errorModel),
85  TestCase::EXTENSIVE);
86  AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 0, 185000, 184670, errorModel),
87  TestCase::EXTENSIVE);
88  AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 0, 148000, 147730, errorModel),
89  TestCase::EXTENSIVE);
90 
91  // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
92  // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
93  // 3 users -> 8 PRB at Itbs 20 -> 469 -> 469000 bytes/sec
94  // 6 users -> 4 PRB at Itbs 20 -> 233 -> 233000 bytes/sec
95  // 9 user -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
96  // 12 users -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
97  // 15 users -> 2 PRB at Itbs 20 * 0.8 -> 90.4 -> 90400 bytes/sec
98  // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
99  // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
100  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
101  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
102  // after the patch enforcing min 3 PRBs per UE:
103  // 9 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/9 UE/TTI -> 82667 bytes/sec
104  // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
105  // 15 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/15 UE/TTI -> 49600 bytes/sec
106  AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 4800, 1383000, 807000, errorModel),
107  TestCase::EXTENSIVE);
108  AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 4800, 469000, 253000, errorModel),
109  TestCase::EXTENSIVE);
110  AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 4800, 233000, 125000, errorModel),
111  TestCase::EXTENSIVE);
112  AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 4800, 113000, 82667, errorModel),
113  TestCase::EXTENSIVE);
114  AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 4800, 113000, 62000, errorModel),
115  TestCase::EXTENSIVE);
116  AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 4800, 90400, 49600, errorModel),
117  TestCase::EXTENSIVE);
118 
119  // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
120  // 1 user -> 24 PRB at Itbs 15 -> 1191 -> 1191000 bytes/sec
121  // 3 users -> 8 PRB at Itbs 15 -> 389 -> 389000 bytes/sec
122  // 6 users -> 4 PRB at Itbs 15 -> 193 -> 193000 bytes/sec
123  // 9 user -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
124  // 12 users -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
125  // 15 users -> 2 PRB at Itbs 15 * 0.8 -> 77.6 -> 77600 bytes/sec
126  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
127  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
128  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
129  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
130  // 9 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/9 UE/TTI -> 64889 bytes/sec
131  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
132  // 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
133  AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 6000, 1191000, 621000, errorModel),
134  TestCase::EXTENSIVE);
135  AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 6000, 389000, 201000, errorModel),
136  TestCase::EXTENSIVE);
137  AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 6000, 193000, 97000, errorModel),
138  TestCase::EXTENSIVE);
139  AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 6000, 97000, 64889, errorModel),
140  TestCase::EXTENSIVE);
141  AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 6000, 97000, 48667, errorModel),
142  TestCase::EXTENSIVE);
143  AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 6000, 77600, 38993, errorModel),
144  TestCase::EXTENSIVE);
145 
146  // DOWNLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
147  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
148  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
149  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
150  // 9 user -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
151  // 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
152  // 15 users -> 2 PRB at Itbs 8 * 0.8 -> 25.6 -> 25600 bytes/sec
153  // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
154  // 1 user -> 25 PRB at Itbs 2 -> 137 -> 137000 bytes/sec
155  // 3 users -> 8 PRB at Itbs 2 -> 41 -> 41000 bytes/sec
156  // 6 users -> 4 PRB at Itbs 2 -> 22 -> 22000 bytes/sec
157  // after the patch enforcing min 3 PRBs per UE:
158  // 9 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/9 UE/TTI -> 16000 bytes/sec
159  // 12 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/12 UE/TTI -> 12000 bytes/sec
160  // 15 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/15 UE/TTI -> 9600 bytes/sec
161  AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 20000, 421000, 137000, errorModel),
162  TestCase::EXTENSIVE);
163  AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 20000, 137000, 41000, errorModel),
164  TestCase::EXTENSIVE);
165  AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 20000, 67000, 22000, errorModel),
166  TestCase::EXTENSIVE);
167  AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 20000, 32000, 16000, errorModel),
168  TestCase::EXTENSIVE);
169  AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 20000, 32000, 12000, errorModel),
170  TestCase::EXTENSIVE);
171  AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 20000, 25600, 9600, errorModel),
172  TestCase::EXTENSIVE);
173 
174  // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
175  // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
176  AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 100000, 0, 0, errorModel), TestCase::QUICK);
177 }
178 
184 
185 std::string
187 {
188  std::ostringstream oss;
189  oss << nUser << " UEs, distance " << dist << " m";
190  return oss.str();
191 }
192 
194  double dist,
195  double thrRefDl,
196  double thrRefUl,
197  bool errorModelEnabled)
198  : TestCase(BuildNameString(nUser, dist)),
199  m_nUser(nUser),
200  m_dist(dist),
201  m_thrRefDl(thrRefDl),
202  m_thrRefUl(thrRefUl),
203  m_errorModelEnabled(errorModelEnabled)
204 {
205 }
206 
208 {
209 }
210 
211 void
213 {
214  NS_LOG_FUNCTION(this << m_nUser << m_dist);
215  if (!m_errorModelEnabled)
216  {
217  Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
218  Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
219  }
220  Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
221  Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
222  StringValue(CreateTempDirFilename("DlMacStats.txt")));
223  Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
224  StringValue(CreateTempDirFilename("UlMacStats.txt")));
225  Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
226  StringValue(CreateTempDirFilename("DlRlcStats.txt")));
227  Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
228  StringValue(CreateTempDirFilename("UlRlcStats.txt")));
229 
230  // This is needed as the RR scheduler does not allocate resources properly for retransmission
231  Config::SetDefault("ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough", BooleanValue(true));
232 
233  // Disable Uplink Power Control
234  Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
235 
240  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
241 
242  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
243 
244  // Create Nodes: eNodeB and UE
245  NodeContainer enbNodes;
246  NodeContainer ueNodes;
247  enbNodes.Create(1);
248  ueNodes.Create(m_nUser);
249 
250  // Install Mobility Model
252  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
253  mobility.Install(enbNodes);
254  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
255  mobility.Install(ueNodes);
256 
257  // Create Devices and install them in the Nodes (eNB and UE)
258  NetDeviceContainer enbDevs;
259  NetDeviceContainer ueDevs;
260  lteHelper->SetSchedulerType("ns3::RrFfMacScheduler");
261  lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
262  enbDevs = lteHelper->InstallEnbDevice(enbNodes);
263  ueDevs = lteHelper->InstallUeDevice(ueNodes);
264 
265  // Attach a UE to a eNB
266  lteHelper->Attach(ueDevs, enbDevs.Get(0));
267 
268  // Activate an EPS bearer
269  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
270  EpsBearer bearer(q);
271  lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
272 
273  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
274  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
275  enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
276  enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
277 
278  // Set UEs' position and power
279  for (int i = 0; i < m_nUser; i++)
280  {
283  mm->SetPosition(Vector(m_dist, 0.0, 0.0));
284  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
285  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
286  uePhy->SetAttribute("TxPower", DoubleValue(23.0));
287  uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
288  }
289 
290  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
291  double statsDuration = 0.4;
292  double tolerance = 0.1;
293  Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
294 
295  lteHelper->EnableRlcTraces();
296  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
297  rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
298  rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
299 
300  Simulator::Run();
301 
305  NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
306  std::vector<uint64_t> dlDataRxed;
308  {
309  m_thrRefDl *= 0.95; // for couting the Vienna AMC behavior: BLER between 0% and 10%
310  }
311  for (int i = 0; i < m_nUser; i++)
312  {
313  // get the imsi
314  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
315  uint8_t lcId = 3;
316  dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
317  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
318  << " bytes rxed " << (double)dlDataRxed.at(i) << " thr "
319  << (double)dlDataRxed.at(i) / statsDuration << " ref " << m_thrRefDl);
320  NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
321  m_thrRefDl,
322  m_thrRefDl * tolerance,
323  " Unfair Throughput!");
324  }
325 
326  NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
327  std::vector<uint64_t> ulDataRxed;
329  {
330  m_thrRefUl *= 0.95; // for couting the Vienna AMC behavior: BLER between 0% and 10%
331  }
332  for (int i = 0; i < m_nUser; i++)
333  {
334  // get the imsi
335  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
336  // get the lcId
337  uint8_t lcId = 3;
338  ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
339  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
340  << " bytes rxed " << (double)ulDataRxed.at(i) << " thr "
341  << (double)ulDataRxed.at(i) / statsDuration << " ref " << m_thrRefUl
342  << " txed " << rlcStats->GetUlTxData(imsi, lcId) / statsDuration);
343  NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
344  m_thrRefUl,
345  m_thrRefUl * tolerance,
346  " Unfair Throughput!");
347  }
348 
349  Simulator::Destroy();
350 }
This system test program creates different test cases with a single eNB and This system test program ...
double m_thrRefDl
the DL throughput reference
void DoRun() override
Implementation to actually run this TestCase.
double m_thrRefUl
the UL throughput reference
bool m_errorModelEnabled
indicates whether the error model is enabled
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
double m_dist
the distance between nodes
LenaRrFfMacSchedulerTestCase(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
Test suite for RrFfMacScheduler test.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Mobility model for which the current position does not change once it has been set and until it is se...
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
Hold variables of type enum.
Definition: enum.h:56
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:91
Qci
QoS Class Indicator.
Definition: eps-bearer.h:106
The eNodeB device implementation.
Ptr< LteEnbPhy > GetPhy() const
Ptr< RadioBearerStatsCalculator > GetRlcStats()
Definition: lte-helper.cc:1708
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:303
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:482
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:289
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:1044
void EnableRlcTraces()
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1563
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1441
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:497
The LteUeNetDevice class implements the UE net device.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:200
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:305
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:442
A suite of tests to run.
Definition: test.h:1256
AttributeValue implementation for Time.
Definition: nstime.h:1423
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:891
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
static LenaTestRrFfMacSchedulerSuite lenaTestRrFfMacSchedulerSuite
Static variable for test initialization.
#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:337
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1336
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:96