A Discrete-Event Network Simulator
API
lte-test-tdmt-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 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  * Dizhi Zhou <dizhi.zhou@gmail.com>
21  */
22 
23 #include <iostream>
24 #include <sstream>
25 #include <string>
26 #include <ns3/object.h>
27 #include <ns3/spectrum-interference.h>
28 #include <ns3/spectrum-error-model.h>
29 #include <ns3/log.h>
30 #include <ns3/test.h>
31 #include <ns3/simulator.h>
32 #include <ns3/packet.h>
33 #include <ns3/ptr.h>
34 #include "ns3/radio-bearer-stats-calculator.h"
35 #include <ns3/constant-position-mobility-model.h>
36 #include <ns3/ff-mac-scheduler.h>
38 #include <ns3/eps-bearer.h>
39 #include <ns3/node-container.h>
40 #include <ns3/mobility-helper.h>
41 #include <ns3/net-device-container.h>
42 #include <ns3/lte-ue-net-device.h>
43 #include <ns3/lte-enb-net-device.h>
44 #include <ns3/lte-ue-rrc.h>
45 #include <ns3/lte-helper.h>
46 #include "ns3/string.h"
47 #include "ns3/double.h"
48 #include <ns3/lte-enb-phy.h>
49 #include <ns3/lte-ue-phy.h>
50 #include <ns3/boolean.h>
51 #include <ns3/enum.h>
52 
53 using namespace ns3;
54 
55 NS_LOG_COMPONENT_DEFINE ("LenaTestTdMtFfMacScheduler");
56 
58  : TestSuite ("lte-tdmt-ff-mac-scheduler", SYSTEM)
59 {
60  NS_LOG_INFO ("creating LenaTestTdMtFfMacSchedulerSuite");
61 
62  bool errorModel = false;
63 
64  //Test Case : AMC works in TDMT
65 
66  //Note: here the MCS is calculated by the wideband CQI
67 
68  // DOWNLINK - DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
69  // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec for one UE; 0 bytes/sec for other UEs
70  // 3 users -> 2196000 among 3 users -> 2196000 bytes/sec for one UE; 0 bytes/sec for other UEs
71  // 6 users -> 2196000 among 6 users -> 2196000 bytes/sec for one UE; 0 bytes/sec for other UEs
72  // 12 users -> 2196000 among 12 users -> 2196000 bytes/sec for one UE; 0 bytes/sec for other UEs
73  // UPLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
74  // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
75  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
76  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
77  // after the patch enforcing min 3 PRBs per UE:
78  // 12 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/12 UE/TTI -> 184670 bytes/sec
79  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (1,0,2196000,2292000, errorModel), TestCase::EXTENSIVE);
80  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (3,0,2196000,749000,errorModel), TestCase::QUICK);
81  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (6,0,2196000,373000, errorModel), TestCase::EXTENSIVE);
82  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (12,0,2196000,184670, errorModel), TestCase::EXTENSIVE);
83 
84  // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
85  // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec for one UE; 0 bytes/sec for other UEs
86  // 3 users -> 1383000 among 3 users -> 1383000 bytes/sec for one UE; 0 bytes/sec for other UEs
87  // 6 users -> 1383000 among 6 users -> 1383000 bytes/sec for one UE; 0 bytes/sec for other UEs
88  // 12 users -> 1383000 among 12 users -> 1383000 bytes/sec for one UE; 0 bytes/sec for other UEs
89  // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
90  // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
91  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
92  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
93  // after the patch enforcing min 3 PRBs per UE:
94  // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
95  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (1,4800,1383000,807000,errorModel), TestCase::EXTENSIVE);
96  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (3,4800,1383000,253000,errorModel), TestCase::EXTENSIVE);
97  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (6,4800,1383000,125000,errorModel), TestCase::EXTENSIVE);
98  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (12,4800,1383000,62000,errorModel), TestCase::EXTENSIVE);
99 
100  // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
101  // 1 user -> 24 PRB at Itbs 18 -> 1191 -> 1191000 byte/sec for one UE; 0 bytes/sec for other UEs
102  // 3 users -> 1191000 among 3 users -> 1191000 bytes/sec for one UE; 0 bytes/sec for other UEs
103  // 6 users -> 1191000 among 6 users -> 1191000 bytes/sec for one UE; 0 bytes/sec for other UEs
104  // 12 users ->1191000 among 12 users -> 1191000 bytes/sec for one UE; 0 bytes/sec for other UEs
105  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
106  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
107  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
108  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
109  // after the patch enforcing min 3 PRBs per UE:
110  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
111  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (1,6000,1191000,621000, errorModel), TestCase::EXTENSIVE);
112  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (3,6000,1191000,201000, errorModel), TestCase::EXTENSIVE);
113  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (6,6000,1191000,97000, errorModel), TestCase::EXTENSIVE);
114  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (12,6000,1191000,48667, errorModel), TestCase::EXTENSIVE);
115 
116  // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
117  // 1 user -> 24 PRB at Itbs 13 -> 775 -> 775000 byte/sec for one UE; 0 bytes/sec for other UEs
118  // 3 users -> 775000 among 3 users -> 775000 bytes/sec for one UE; 0 bytes/sec for other UEs
119  // 6 users -> 775000 among 6 users -> 775000 bytes/sec for one UE; 0 bytes/sec for other UEs
120  // 12 users -> 775000 among 12 users -> 775000 bytes/sec for one UE; 0 bytes/sec for other UEs
121  // UPLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
122  // 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 bytes/sec
123  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
124  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
125  // after the patch enforcing min 3 PRBs per UE:
126  // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 bytes/sec
127  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (1,10000,775000,437000,errorModel), TestCase::EXTENSIVE);
128  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (3,10000,775000,137000,errorModel), TestCase::EXTENSIVE);
129  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (6,10000,775000,67000,errorModel), TestCase::EXTENSIVE);
130  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (12,10000,775000,32667,errorModel), TestCase::EXTENSIVE);
131 
132  // DONWLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
133  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec for one UE; 0 bytes/sec for other UEs
134  // 3 users -> 421000 among 3 users -> 421000 bytes/sec for one UE; 0 bytes/sec for other UEs
135  // 6 users -> 421000 among 6 users -> 421000 bytes/sec for one UE; 0 bytes/sec for other UEs
136  // 12 users -> 421000 among 12 users -> 421000 bytes/sec for one UE; 0 bytes/sec for other UEs
137  // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
138  // 1 user -> 25 PRB at Itbs 2 -> 233 -> 137000 bytes/sec
139  // 3 users -> 8 PRB at Itbs 2 -> 69 -> 41000 bytes/sec
140  // 6 users -> 4 PRB at Itbs 2 -> 32 -> 22000 bytes/sec
141  // after the patch enforcing min 3 PRBs per UE:
142  // 12 users -> 3 PRB at Itbs 2 -> 26 bytes * 8/12 UE/TTI -> 12000 bytes/sec
143  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (1,20000,421000,137000,errorModel), TestCase::EXTENSIVE);
144  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (3,20000,421000,41000,errorModel), TestCase::EXTENSIVE);
145  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (6,20000,421000,22000,errorModel), TestCase::EXTENSIVE);
146  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (12,20000,421000,12000,errorModel), TestCase::EXTENSIVE);
147 
148  // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
149  // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
150  AddTestCase (new LenaTdMtFfMacSchedulerTestCase (1,100000,0,0,errorModel), TestCase::QUICK);
151 }
152 
154 
155 
156 // --------------- T E S T - C A S E ------------------------------
157 
158 std::string
160 {
161  std::ostringstream oss;
162  oss << nUser << " UEs, distance " << dist << " m";
163  return oss.str ();
164 }
165 
166 LenaTdMtFfMacSchedulerTestCase::LenaTdMtFfMacSchedulerTestCase (uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
167  : TestCase (BuildNameString (nUser, dist)),
168  m_nUser (nUser),
169  m_dist (dist),
170  m_thrRefDl (thrRefDl),
171  m_thrRefUl (thrRefUl),
172  m_errorModelEnabled (errorModelEnabled)
173 {
174 }
175 
177 {
178 }
179 
180 
181 void
183 {
184 
185  NS_LOG_FUNCTION (this << m_nUser << m_dist);
186 
187  if (!m_errorModelEnabled)
188  {
189  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
190  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
191  }
192 
193  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
194  Config::SetDefault ("ns3::MacStatsCalculator::DlOutputFilename", StringValue (CreateTempDirFilename ("DlMacStats.txt")));
195  Config::SetDefault ("ns3::MacStatsCalculator::UlOutputFilename", StringValue (CreateTempDirFilename ("UlMacStats.txt")));
196  Config::SetDefault ("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename", StringValue (CreateTempDirFilename ("DlRlcStats.txt")));
197  Config::SetDefault ("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename", StringValue (CreateTempDirFilename ("UlRlcStats.txt")));
198 
199  //Disable Uplink Power Control
200  Config::SetDefault ("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue (false));
201 
206  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
207  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
208 
209  // Create Nodes: eNodeB and UE
210  NodeContainer enbNodes;
211  NodeContainer ueNodes;
212  enbNodes.Create (1);
213  ueNodes.Create (m_nUser);
214 
215  // Install Mobility Model
217  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
218  mobility.Install (enbNodes);
219  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
220  mobility.Install (ueNodes);
221 
222  // Create Devices and install them in the Nodes (eNB and UE)
223  NetDeviceContainer enbDevs;
224  NetDeviceContainer ueDevs;
225  lteHelper->SetSchedulerType ("ns3::TdMtFfMacScheduler");
226  lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::SRS_UL_CQI));
227  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
228  ueDevs = lteHelper->InstallUeDevice (ueNodes);
229 
230  // Attach a UE to a eNB
231  lteHelper->Attach (ueDevs, enbDevs.Get (0));
232 
233  // Activate an EPS bearer
234  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
235  EpsBearer bearer (q);
236  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
237 
238 
239  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
240  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
241  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
242  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
243 
244  // Set UEs' position and power
245  for (int i = 0; i < m_nUser; i++)
246  {
248  mm->SetPosition (Vector (m_dist, 0.0, 0.0));
249  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
250  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
251  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
252  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
253  }
254 
255 
256  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
257  double statsDuration = 0.6;
258  double tolerance = 0.1;
259  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.000001));
260 
261  lteHelper->EnableMacTraces ();
262  lteHelper->EnableRlcTraces ();
263  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
264  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
265  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
266 
267 
268  Simulator::Run ();
269 
273  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
274  std::vector <uint64_t> dlDataRxed;
275  for (int i = 0; i < m_nUser; i++)
276  {
277  // get the imsi
278  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
279  uint8_t lcId = 3;
280  dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
281  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_thrRefDl);
282  }
283 
289  uint8_t found = 0;
290  for (int i = 0; i < m_nUser; i++)
291  {
292  double throughput = (double)dlDataRxed.at (i) / statsDuration;
293  if (throughput != 0 && found == 0)
294  {
295  NS_TEST_ASSERT_MSG_EQ_TOL (throughput, m_thrRefDl, m_thrRefDl * tolerance, " Unfair Throughput!");
296  found = 1;
297  }
298  else if (throughput != 0 && found == 1)
299  {
300  NS_TEST_ASSERT_MSG_EQ_TOL (0, m_thrRefDl, m_thrRefDl * tolerance, " Unfair Throughput!");
301  }
302  else
303  NS_TEST_ASSERT_MSG_EQ_TOL (throughput, 0, 0, " Unfair Throughput!");
304  }
305 
309  NS_LOG_INFO ("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
310  std::vector <uint64_t> ulDataRxed;
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  // get the lcId
316  uint8_t lcId = 3;
317  ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
318  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at (i) << " thr " << (double)ulDataRxed.at (i) / statsDuration << " ref " << m_thrRefUl);
319  }
326  for (int i = 0; i < m_nUser; i++)
327  {
328  NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, m_thrRefUl, m_thrRefUl * tolerance, " Unfair Throughput!");
329  }
330  Simulator::Destroy ();
331 
332 }
333 
This system test program creates different test cases with a single eNB and several UEs,...
double m_dist
the distance between nodes
double m_thrRefUl
the UL throughput reference
double m_thrRefDl
the DL throughput reference
virtual void DoRun(void)
Implementation to actually run this TestCase.
LenaTdMtFfMacSchedulerTestCase(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
bool m_errorModelEnabled
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.
Test suite for TdMtFfMacScheduler tests.
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:41
Hold variables of type enum.
Definition: enum.h:55
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:92
Qci
QoS Class Indicator.
Definition: eps-bearer.h:107
The eNodeB device implementation.
Ptr< LteEnbPhy > GetPhy(void) const
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:293
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:474
Ptr< RadioBearerStatsCalculator > GetRlcStats(void)
Definition: lte-helper.cc:1572
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:279
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:959
void EnableRlcTraces(void)
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1435
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1313
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:489
void EnableMacTraces(void)
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1529
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:256
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Hold variables of type string.
Definition: string.h:41
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:430
A suite of tests to run.
Definition: test.h:1188
AttributeValue implementation for Time.
Definition: nstime.h:1308
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#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:281
#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:323
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
static LenaTestTdMtFfMacSchedulerSuite lenaTestTdMtFfMacSchedulerSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:108