22 #include <ns3/simulator.h>
24 #include <ns3/callback.h>
25 #include <ns3/config.h>
26 #include <ns3/string.h>
27 #include <ns3/double.h>
29 #include <ns3/boolean.h>
30 #include <ns3/pointer.h>
32 #include "ns3/mobility-helper.h"
33 #include "ns3/lte-helper.h"
35 #include <ns3/ff-mac-scheduler.h>
36 #include <ns3/lte-enb-net-device.h>
37 #include <ns3/lte-enb-phy.h>
38 #include <ns3/lte-enb-rrc.h>
39 #include <ns3/lte-ue-net-device.h>
40 #include <ns3/lte-ue-phy.h>
41 #include <ns3/lte-ue-rrc.h>
44 #include <ns3/lte-common.h>
47 #include <ns3/lte-chunk-processor.h>
50 #include <ns3/lte-rrc-sap.h>
61 :
TestSuite (
"lte-downlink-power-control", SYSTEM)
65 NS_LOG_INFO (
"Creating LteDownlinkPowerControlTestSuite");
69 std::vector<int> activeRbs_txpowdB30nrb6run1earfcn500 (4);
70 activeRbs_txpowdB30nrb6run1earfcn500[0] = 0;
71 activeRbs_txpowdB30nrb6run1earfcn500[1] = 2;
72 activeRbs_txpowdB30nrb6run1earfcn500[2] = 3;
73 activeRbs_txpowdB30nrb6run1earfcn500[3] = 5;
75 uint16_t earfcn = 500;
79 std::map<int, double> powerTxMap;
80 double rbTxPower = powerTx;
83 powerTxMap.insert (std::pair<int,double>(0, rbTxPower));
86 powerTxMap.insert (std::pair<int,double>(2, rbTxPower));
89 powerTxMap.insert (std::pair<int,double>(3, rbTxPower));
92 powerTxMap.insert (std::pair<int,double>(5, rbTxPower));
94 SpectrumValue spectrumValue_txpowdB30nrb6run1earfcn500 (LteSpectrumValueHelper::GetSpectrumModel (500, 6));
95 spectrumValue_txpowdB30nrb6run1earfcn500[0] = 2.325820769916e-07;
96 spectrumValue_txpowdB30nrb6run1earfcn500[1] = 0.000000000000e+00;
97 spectrumValue_txpowdB30nrb6run1earfcn500[2] = 4.640622533585e-07;
98 spectrumValue_txpowdB30nrb6run1earfcn500[3] = 9.259259259259e-07;
99 spectrumValue_txpowdB30nrb6run1earfcn500[4] = 0.000000000000e+00;
100 spectrumValue_txpowdB30nrb6run1earfcn500[5] = 1.467493696723e-06;
104 powerTxMap, activeRbs_txpowdB30nrb6run1earfcn500,
105 spectrumValue_txpowdB30nrb6run1earfcn500), TestCase::QUICK);
109 std::vector<int> activeRbs_txpowdB30nrb6run1earfcn500 (4);
110 activeRbs_txpowdB30nrb6run1earfcn500[0] = 0;
111 activeRbs_txpowdB30nrb6run1earfcn500[1] = 2;
112 activeRbs_txpowdB30nrb6run1earfcn500[2] = 3;
113 activeRbs_txpowdB30nrb6run1earfcn500[3] = 5;
115 uint16_t earfcn = 500;
119 std::map<int, double> powerTxMap;
120 double rbTxPower = powerTx;
123 powerTxMap.insert (std::pair<int,double>(2, rbTxPower));
126 powerTxMap.insert (std::pair<int,double>(3, rbTxPower));
129 powerTxMap.insert (std::pair<int,double>(5, rbTxPower));
131 SpectrumValue spectrumValue_txpowdB30nrb6run1earfcn500 (LteSpectrumValueHelper::GetSpectrumModel (500, 6));
132 spectrumValue_txpowdB30nrb6run1earfcn500[0] = 9.259259259259e-07;
133 spectrumValue_txpowdB30nrb6run1earfcn500[1] = 0.000000000000e+00;
134 spectrumValue_txpowdB30nrb6run1earfcn500[2] = 4.640622533585e-07;
135 spectrumValue_txpowdB30nrb6run1earfcn500[3] = 9.259259259259e-07;
136 spectrumValue_txpowdB30nrb6run1earfcn500[4] = 0.000000000000e+00;
137 spectrumValue_txpowdB30nrb6run1earfcn500[5] = 1.467493696723e-06;
141 powerTxMap, activeRbs_txpowdB30nrb6run1earfcn500,
142 spectrumValue_txpowdB30nrb6run1earfcn500), TestCase::QUICK);
145 std::vector<int> activeRbs_txpowdB30nrb25run1earfcn500 (15);
146 activeRbs_txpowdB30nrb25run1earfcn500[0] = 0;
147 activeRbs_txpowdB30nrb25run1earfcn500[1] = 1;
148 activeRbs_txpowdB30nrb25run1earfcn500[2] = 2;
149 activeRbs_txpowdB30nrb25run1earfcn500[3] = 3;
150 activeRbs_txpowdB30nrb25run1earfcn500[4] = 7;
151 activeRbs_txpowdB30nrb25run1earfcn500[5] = 8;
152 activeRbs_txpowdB30nrb25run1earfcn500[6] = 9;
153 activeRbs_txpowdB30nrb25run1earfcn500[7] = 11;
154 activeRbs_txpowdB30nrb25run1earfcn500[8] = 13;
155 activeRbs_txpowdB30nrb25run1earfcn500[9] = 14;
156 activeRbs_txpowdB30nrb25run1earfcn500[10] = 18;
157 activeRbs_txpowdB30nrb25run1earfcn500[11] = 19;
158 activeRbs_txpowdB30nrb25run1earfcn500[12] = 20;
159 activeRbs_txpowdB30nrb25run1earfcn500[13] = 21;
160 activeRbs_txpowdB30nrb25run1earfcn500[14] = 24;
162 uint16_t earfcn = 500;
166 std::map<int, double> powerTxMap;
167 double rbTxPower = powerTx;
169 powerTxMap.insert (std::pair<int,double>(0, rbTxPower));
171 powerTxMap.insert (std::pair<int,double>(1, rbTxPower));
173 powerTxMap.insert (std::pair<int,double>(2, rbTxPower));
175 powerTxMap.insert (std::pair<int,double>(3, rbTxPower));
177 powerTxMap.insert (std::pair<int,double>(7, rbTxPower));
179 powerTxMap.insert (std::pair<int,double>(8, rbTxPower));
181 powerTxMap.insert (std::pair<int,double>(9, rbTxPower));
183 powerTxMap.insert (std::pair<int,double>(11, rbTxPower));
185 powerTxMap.insert (std::pair<int,double>(13, rbTxPower));
187 powerTxMap.insert (std::pair<int,double>(14, rbTxPower));
189 powerTxMap.insert (std::pair<int,double>(18, rbTxPower));
191 powerTxMap.insert (std::pair<int,double>(19, rbTxPower));
193 powerTxMap.insert (std::pair<int,double>(20, rbTxPower));
195 powerTxMap.insert (std::pair<int,double>(21, rbTxPower));
197 powerTxMap.insert (std::pair<int,double>(24, rbTxPower));
200 SpectrumValue spectrumValue_txpowdB30nrb25run1earfcn500 (LteSpectrumValueHelper::GetSpectrumModel (500, bw));
201 spectrumValue_txpowdB30nrb25run1earfcn500[0] = 1.113749408060e-07;
202 spectrumValue_txpowdB30nrb25run1earfcn500[1] = 7.409475839182e-08;
203 spectrumValue_txpowdB30nrb25run1earfcn500[2] = 5.581969847799e-08;
204 spectrumValue_txpowdB30nrb25run1earfcn500[3] = 2.797612026209e-07;
205 spectrumValue_txpowdB30nrb25run1earfcn500[4] = 0.000000000000e+00;
206 spectrumValue_txpowdB30nrb25run1earfcn500[5] = 0.000000000000e+00;
207 spectrumValue_txpowdB30nrb25run1earfcn500[6] = 0.000000000000e+00;
208 spectrumValue_txpowdB30nrb25run1earfcn500[7] = 3.521984872135e-07;
209 spectrumValue_txpowdB30nrb25run1earfcn500[8] = 3.521984872135e-07;
210 spectrumValue_txpowdB30nrb25run1earfcn500[9] = 3.521984872135e-07;
211 spectrumValue_txpowdB30nrb25run1earfcn500[10] = 0.000000000000e+00;
212 spectrumValue_txpowdB30nrb25run1earfcn500[11] = 1.478384791559e-07;
213 spectrumValue_txpowdB30nrb25run1earfcn500[12] = 0.000000000000e+00;
214 spectrumValue_txpowdB30nrb25run1earfcn500[13] = 3.521984872135e-07;
215 spectrumValue_txpowdB30nrb25run1earfcn500[14] = 1.113749408060e-07;
216 spectrumValue_txpowdB30nrb25run1earfcn500[15] = 0.000000000000e+00;
217 spectrumValue_txpowdB30nrb25run1earfcn500[16] = 0.000000000000e+00;
218 spectrumValue_txpowdB30nrb25run1earfcn500[17] = 0.000000000000e+00;
219 spectrumValue_txpowdB30nrb25run1earfcn500[18] = 2.222222222222e-07;
220 spectrumValue_txpowdB30nrb25run1earfcn500[19] = 1.113749408060e-07;
221 spectrumValue_txpowdB30nrb25run1earfcn500[20] = 1.113749408060e-07;
222 spectrumValue_txpowdB30nrb25run1earfcn500[21] = 7.409475839182e-08;
223 spectrumValue_txpowdB30nrb25run1earfcn500[22] = 0.000000000000e+00;
224 spectrumValue_txpowdB30nrb25run1earfcn500[23] = 0.000000000000e+00;
225 spectrumValue_txpowdB30nrb25run1earfcn500[24] = 4.433916255486e-07;
229 powerTxMap, activeRbs_txpowdB30nrb25run1earfcn500,
230 spectrumValue_txpowdB30nrb25run1earfcn500), TestCase::QUICK);
234 std::vector<int> activeRbs_txpowdB30nrb25run1earfcn500 (15);
235 activeRbs_txpowdB30nrb25run1earfcn500[0] = 0;
236 activeRbs_txpowdB30nrb25run1earfcn500[1] = 1;
237 activeRbs_txpowdB30nrb25run1earfcn500[2] = 2;
238 activeRbs_txpowdB30nrb25run1earfcn500[3] = 3;
239 activeRbs_txpowdB30nrb25run1earfcn500[4] = 7;
240 activeRbs_txpowdB30nrb25run1earfcn500[5] = 8;
241 activeRbs_txpowdB30nrb25run1earfcn500[6] = 9;
242 activeRbs_txpowdB30nrb25run1earfcn500[7] = 11;
243 activeRbs_txpowdB30nrb25run1earfcn500[8] = 13;
244 activeRbs_txpowdB30nrb25run1earfcn500[9] = 14;
245 activeRbs_txpowdB30nrb25run1earfcn500[10] = 18;
246 activeRbs_txpowdB30nrb25run1earfcn500[11] = 19;
247 activeRbs_txpowdB30nrb25run1earfcn500[12] = 20;
248 activeRbs_txpowdB30nrb25run1earfcn500[13] = 21;
249 activeRbs_txpowdB30nrb25run1earfcn500[14] = 24;
251 uint16_t earfcn = 500;
255 std::map<int, double> powerTxMap;
256 double rbTxPower = powerTx;
258 powerTxMap.insert (std::pair<int,double>(0, rbTxPower));
260 powerTxMap.insert (std::pair<int,double>(2, rbTxPower));
262 powerTxMap.insert (std::pair<int,double>(3, rbTxPower));
264 powerTxMap.insert (std::pair<int,double>(7, rbTxPower));
266 powerTxMap.insert (std::pair<int,double>(8, rbTxPower));
268 powerTxMap.insert (std::pair<int,double>(13, rbTxPower));
270 powerTxMap.insert (std::pair<int,double>(14, rbTxPower));
272 powerTxMap.insert (std::pair<int,double>(18, rbTxPower));
274 powerTxMap.insert (std::pair<int,double>(19, rbTxPower));
276 powerTxMap.insert (std::pair<int,double>(24, rbTxPower));
279 SpectrumValue spectrumValue_txpowdB30nrb25run1earfcn500 (LteSpectrumValueHelper::GetSpectrumModel (500, bw));
280 spectrumValue_txpowdB30nrb25run1earfcn500[0] = 1.113749408060e-07;
281 spectrumValue_txpowdB30nrb25run1earfcn500[1] = 2.222222222222e-07;
282 spectrumValue_txpowdB30nrb25run1earfcn500[2] = 5.581969847799e-08;
283 spectrumValue_txpowdB30nrb25run1earfcn500[3] = 2.797612026209e-07;
284 spectrumValue_txpowdB30nrb25run1earfcn500[4] = 0.000000000000e+00;
285 spectrumValue_txpowdB30nrb25run1earfcn500[5] = 0.000000000000e+00;
286 spectrumValue_txpowdB30nrb25run1earfcn500[6] = 0.000000000000e+00;
287 spectrumValue_txpowdB30nrb25run1earfcn500[7] = 3.521984872135e-07;
288 spectrumValue_txpowdB30nrb25run1earfcn500[8] = 3.521984872135e-07;
289 spectrumValue_txpowdB30nrb25run1earfcn500[9] = 2.222222222222e-07;
290 spectrumValue_txpowdB30nrb25run1earfcn500[10] = 0.000000000000e+00;
291 spectrumValue_txpowdB30nrb25run1earfcn500[11] = 2.222222222222e-07;
292 spectrumValue_txpowdB30nrb25run1earfcn500[12] = 0.000000000000e+00;
293 spectrumValue_txpowdB30nrb25run1earfcn500[13] = 3.521984872135e-07;
294 spectrumValue_txpowdB30nrb25run1earfcn500[14] = 1.113749408060e-07;
295 spectrumValue_txpowdB30nrb25run1earfcn500[15] = 0.000000000000e+00;
296 spectrumValue_txpowdB30nrb25run1earfcn500[16] = 0.000000000000e+00;
297 spectrumValue_txpowdB30nrb25run1earfcn500[17] = 0.000000000000e+00;
298 spectrumValue_txpowdB30nrb25run1earfcn500[18] = 2.222222222222e-07;
299 spectrumValue_txpowdB30nrb25run1earfcn500[19] = 1.113749408060e-07;
300 spectrumValue_txpowdB30nrb25run1earfcn500[20] = 2.222222222222e-07;
301 spectrumValue_txpowdB30nrb25run1earfcn500[21] = 2.222222222222e-07;
302 spectrumValue_txpowdB30nrb25run1earfcn500[22] = 0.000000000000e+00;
303 spectrumValue_txpowdB30nrb25run1earfcn500[23] = 0.000000000000e+00;
304 spectrumValue_txpowdB30nrb25run1earfcn500[24] = 4.433916255486e-07;
308 powerTxMap, activeRbs_txpowdB30nrb25run1earfcn500,
309 spectrumValue_txpowdB30nrb25run1earfcn500), TestCase::QUICK);
315 "DataCtrlPowerDifference_noChange"), TestCase::QUICK);
317 "DataCtrlPowerDifference_dB_6"), TestCase::QUICK);
319 "DataCtrlPowerDifference_dB_4dot77"), TestCase::QUICK);
321 "DataCtrlPowerDifference_dB_3"), TestCase::QUICK);
323 "DataCtrlPowerDifference_dB_1dot77"), TestCase::QUICK);
325 "DataCtrlPowerDifference_dB0"), TestCase::QUICK);
327 "DataCtrlPowerDifference_dB1"), TestCase::QUICK);
329 "DataCtrlPowerDifference_dB2"), TestCase::QUICK);
331 "DataCtrlPowerDifference_dB3"), TestCase::QUICK);
345 pdschConfigDedicated.
pa = pa;
346 double rbTxpower = txPower + LteRrcSap::ConvertPdschConfigDedicated2Double (pdschConfigDedicated);
359 uint16_t earfcn, uint16_t bw,
double powerTx,
360 std::map<int, double> powerTxMap, std::vector <int> activeRbs,
362 :
TestCase (
"Downlink Power Control: " + name),
363 m_actual (
LteSpectrumValueHelper::CreateTxPowerSpectralDensity (earfcn, bw, powerTx, powerTxMap, activeRbs)),
366 NS_LOG_INFO (
"Creating LteDownlinkPowerControlTestCase");
376 NS_LOG_INFO (
"Creating LteDownlinkPowerControlSpectrumValueTestCase");
383 :
TestCase (
"Downlink Power Control: " + name)
388 NS_LOG_INFO (
"Creating LteDownlinkPowerControlTestCase");
417 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
428 lteHelper->
Attach (ueDevs, enbDevs.
Get (0));
448 testDlDataPowerReceived->AddCallback (
MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlDataPowerReceivedCatcher));
453 testDlCtrlPowerReceived->
AddCallback (
MakeCallback (&LteSpectrumValueCatcher::ReportValue, &dlCtrlPowerReceivedCatcher));
456 Simulator::Stop (
Seconds (0.400));
459 double dataPower = 10.0 * std::log10 (dlDataPowerReceivedCatcher.
GetValue ()->operator[] (0));
460 double ctrlPower = 10.0 * std::log10 (dlCtrlPowerReceivedCatcher.
GetValue ()->operator[] (0));
461 double powerDiff = (-1.0)*ctrlPower + dataPower;
469 "Downlink Data and Ctrl Power Difference are not equal within tolerance");
471 Simulator::Destroy ();
476 std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
483 std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
490 std::string context, uint16_t rnti, uint8_t pa)
497 :
TestCase (
"Downlink Power Control: " + name),
498 m_useIdealRrc (useIdealRrc),
499 m_changePdschConfigDedicatedTriggered (false),
500 m_connectionReconfigurationUeReceived (false),
501 m_connectionReconfigurationEnbCompleted (false)
515 NS_LOG_DEBUG (
"eNb ConnectionReconfigurationCompleted");
533 NS_LOG_DEBUG (
"FFR Algorithm ChangePdschConfigDedicated");
559 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
570 lteHelper->
Attach (ueDevs, enbDevs.
Get (0));
576 pdschConfigDedicated.
pa = LteRrcSap::PdschConfigDedicated::dB_6;
585 Config::Connect (
"/NodeList/0/DeviceList/0/LteFfrAlgorithm/ChangePdschConfigDedicated",
587 Config::Connect (
"/NodeList/1/DeviceList/0/LteUeRrc/ConnectionReconfiguration",
589 Config::Connect (
"/NodeList/0/DeviceList/0/LteEnbRrc/ConnectionReconfiguration",
592 Simulator::Stop (
Seconds (0.400));
596 "Ffr have not changed PdschConfigDedicated for UE");
598 "Ue have not received RrcConnectionReconfiguration");
600 "Enb have not received RrcConnectionReconfigurationCompleted");
602 Simulator::Destroy ();