21 #include <ns3/callback.h>
22 #include <ns3/constant-position-mobility-model.h>
24 #include <ns3/lte-helper.h>
25 #include <ns3/lte-spectrum-value-helper.h>
26 #include <ns3/lte-ue-rrc.h>
27 #include <ns3/mobility-helper.h>
28 #include <ns3/net-device-container.h>
29 #include <ns3/node-container.h>
30 #include <ns3/object.h>
32 #include <ns3/simulator.h>
91 uint16_t numberOfComponentCarriers,
92 std::vector<ConfigToCheck> configToCheck,
93 Time simulationDuration)
94 :
TestCase(BuildNameString(numberOfNodes,
95 numberOfComponentCarriers,
98 m_numberOfNodes(numberOfNodes),
99 m_numberOfComponentCarriers(numberOfComponentCarriers),
100 m_configToCheck(configToCheck),
101 m_simulationDuration(simulationDuration)
103 m_connectionCounter = 0.0;
107 void DoRun()
override;
118 std::string BuildNameString(uint32_t numberOfNodes,
119 uint16_t numberOfComponentCarriers,
120 std::vector<ConfigToCheck> configToCheck,
121 Time simulationDuration);
129 void Evaluate(std::string context,
131 std::list<LteRrcSap::SCellToAddMod> sCellToAddModList);
137 std::vector<std::map<uint16_t, ConfigToCheck>> EquallySpacedCcs();
141 std::vector<ConfigToCheck>
145 std::vector<std::map<uint16_t, ConfigToCheck>>
152 uint16_t numberOfComponentCarriers,
153 std::vector<ConfigToCheck> configToCheck,
154 Time simulationDuration)
156 std::ostringstream oss;
157 oss <<
" nodes " << numberOfNodes <<
" carriers " << numberOfComponentCarriers
158 <<
" configurations " << configToCheck.size() <<
" duration " << simulationDuration;
162 std::vector<std::map<uint16_t, ConfigToCheck>>
165 std::vector<std::map<uint16_t, ConfigToCheck>> configToCheckContainer;
167 for (
auto& it : m_configToCheck)
169 std::map<uint16_t, ConfigToCheck> ccmap;
170 uint32_t ulEarfcn = it.m_ulEarfcn;
171 uint32_t dlEarfcn = it.m_dlEarfcn;
172 uint32_t maxBandwidthRb = std::max<uint32_t>(it.m_ulBandwidth, it.m_dlBandwidth);
175 uint32_t maxBandwidthKhz =
178 for (uint16_t i = 0; i < m_numberOfComponentCarriers; i++)
186 NS_FATAL_ERROR(
"Band is not wide enough to allocate " << m_numberOfComponentCarriers
196 ccmap.insert(std::pair<uint16_t, ConfigToCheck>(i, cc));
198 NS_LOG_INFO(
"UL BW: " << it.m_ulBandwidth <<
", DL BW: " << it.m_dlBandwidth
199 <<
", UL Earfcn: " << ulEarfcn <<
", DL Earfcn: " << dlEarfcn);
203 uint32_t frequencyShift = 300 * (1 + (maxBandwidthKhz - 1) / 300);
206 uint32_t earfcnShift = frequencyShift / 100;
207 ulEarfcn += earfcnShift;
208 dlEarfcn += earfcnShift;
211 configToCheckContainer.push_back(ccmap);
214 return configToCheckContainer;
220 std::list<LteRrcSap::SCellToAddMod> sCellToAddModList)
224 uint16_t cellId = ueRrc->GetCellId();
226 NS_LOG_INFO(
"m_configToCheckContainer size " << m_configToCheckContainer.size());
228 ++m_connectionCounter;
230 std::map<uint16_t, ConfigToCheck> configToCheckMap;
234 configToCheckMap = m_configToCheckContainer[cellId - 1];
238 uint16_t n1 =
std::max(cellId, m_numberOfComponentCarriers);
239 uint16_t n2 =
std::min(cellId, m_numberOfComponentCarriers);
240 configToCheckMap = m_configToCheckContainer[n1 - n2];
244 <<
static_cast<uint16_t
>(ueRrc->GetUlBandwidth())
245 <<
", DL BW: " <<
static_cast<uint16_t
>(ueRrc->GetDlBandwidth()) <<
", UL Earfcn: "
246 << ueRrc->GetUlEarfcn() <<
", DL Earfcn: " << ueRrc->GetDlEarfcn());
248 for (
auto scell : sCellToAddModList)
251 <<
static_cast<uint16_t
>(scell.radioResourceConfigCommonSCell.ulConfiguration
252 .ulFreqInfo.ulBandwidth)
254 <<
static_cast<uint16_t
>(
255 scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth)
257 << scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarrierFreq
258 <<
", DL Earfcn: " << scell.cellIdentification.dlCarrierFreq);
265 static_cast<uint16_t
>(ueRrc->GetDlBandwidth()),
266 "Primary Carrier DL bandwidth configuration failed");
268 static_cast<uint16_t
>(ueRrc->GetUlBandwidth()),
269 "Primary Carrier UL bandwidth configuration failed");
271 ueRrc->GetDlEarfcn(),
272 "Primary Carrier DL EARFCN configuration failed");
274 ueRrc->GetUlEarfcn(),
275 "Primary Carrier UL EARFCN configuration failed");
277 uint32_t ConfigToCheckMapIndex = 1;
279 for (
auto scell : sCellToAddModList)
281 sCConfig = configToCheckMap[ConfigToCheckMapIndex];
285 static_cast<uint16_t
>(
286 scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth),
287 "Secondary Carrier DL bandwidth configuration failed");
290 static_cast<uint16_t
>(
291 scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulBandwidth),
292 "Secondary Carrier UL bandwidth configuration failed");
294 scell.cellIdentification.dlCarrierFreq,
295 "Secondary Carrier DL EARFCN configuration failed");
298 scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarrierFreq,
299 "Secondary Carrier UL EARFCN configuration failed");
300 ConfigToCheckMapIndex++;
320 enbNodes.
Create(m_numberOfNodes);
321 ueNodes.
Create(m_numberOfNodes);
323 uint32_t totalNumberOfNodes = enbNodes.
GetN() + ueNodes.
GetN();
327 for (uint32_t i = 0; i < totalNumberOfNodes; i++)
329 positionAlloc->Add(Vector(2 * i, 0, 0));
333 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
334 mobility.SetPositionAllocator(positionAlloc);
336 for (uint32_t n = 0; n < m_numberOfNodes; ++n)
347 for (uint32_t i = 0; i < m_configToCheck.size(); ++i)
349 configuration = m_configToCheck[i];
364 m_configToCheckContainer = EquallySpacedCcs();
367 for (uint32_t
k = 0;
k < m_numberOfNodes; ++
k)
377 Config::Connect(
"/NodeList/*/DeviceList/*/LteUeRrc/SCarrierConfigured",
400 :
TestSuite(
"lte-carrier-aggregation-configuration", SYSTEM)
402 std::vector<ConfigToCheck> configToCheck;
413 configToCheck.push_back(configToCheckTest1);
414 uint32_t numberOfNodes = 1;
415 uint16_t numberOfComponentCarriers = 2;
419 numberOfComponentCarriers,
425 configToCheck.clear();
434 configToCheck.push_back(configToCheckTest1);
441 configToCheck.push_back(configToCheckTest2);
443 simulationDuration =
Seconds(2);
446 numberOfComponentCarriers,
Carrier aggregation configuration test case.
CarrierAggregationConfigTestCase(uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector< ConfigToCheck > configToCheck, Time simulationDuration)
Constructor.
Time m_simulationDuration
Simulation duration.
uint32_t m_numberOfNodes
Number of nodes.
uint16_t m_numberOfComponentCarriers
Number of component carriers.
void Evaluate(std::string context, Ptr< LteUeRrc > ueRrc, std::list< LteRrcSap::SCellToAddMod > sCellToAddModList)
Evaluate function.
uint32_t m_connectionCounter
Connection counter.
std::vector< std::map< uint16_t, ConfigToCheck > > m_configToCheckContainer
Vector of maps containing the per component carrier configuration.
std::vector< ConfigToCheck > m_configToCheck
Vector containing all the configurations to check.
std::string BuildNameString(uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector< ConfigToCheck > configToCheck, Time simulationDuration)
Build name string function.
void DoRun() override
Implementation to actually run this TestCase.
std::vector< std::map< uint16_t, ConfigToCheck > > EquallySpacedCcs()
Equally spaced component carriers function.
Carrier aggregation configuration test suite.
CarrierAggregationConfigTestSuite()
This class contains the specification of EPS Bearers.
@ GBR_CONV_VOICE
GBR Conversational Voice.
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
void SetEnbDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the eNodeB devices (LteEnbNetDevice) to be created.
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
void SetUeDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the UE devices (LteUeNetDevice) to be created.
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used.
static uint16_t GetUplinkCarrierBand(uint32_t nUl)
Converts uplink EARFCN to corresponding LTE frequency band number.
static uint16_t GetDownlinkCarrierBand(uint32_t nDl)
Converts downlink EARFCN to corresponding LTE frequency band number.
static double GetChannelBandwidth(uint16_t txBandwidthConf)
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
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.
uint32_t GetN() const
Get the number of Ptr<Node> stored in this container.
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.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
Hold an unsigned integer type.
void SetDefault(std::string name, const AttributeValue &value)
void Connect(std::string path, const CallbackBase &cb)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
static CarrierAggregationConfigTestSuite g_carrierAggregationConfigTestSuite
Static variable for test initialization.
#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.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
This test suite verifies following two things:
uint16_t m_ulBandwidth
Uplink bandwidth.
uint32_t m_dlEarfcn
Downlink EARFCN.
uint32_t m_ulEarfcn
Uplink EARFCN.
uint16_t m_dlBandwidth
Downlink bandwidth.