A Discrete-Event Network Simulator
API
lte-common.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011 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: Manuel Requena <manuel.requena@cttc.es>
18 * Author: Marco Miozzo <marco.miozzo@cttc.es>
19 */
20
21#include "lte-common.h"
22
23#include <ns3/abort.h>
24#include <ns3/log.h>
25
26namespace ns3
27{
28
29NS_LOG_COMPONENT_DEFINE("LteCommon");
30
32{
33}
34
35LteFlowId_t::LteFlowId_t(const uint16_t a, const uint8_t b)
36 : m_rnti(a),
37 m_lcId(b)
38{
39}
40
48bool
50{
51 return ((a.m_rnti == b.m_rnti) && (a.m_lcId == b.m_lcId));
52}
53
61bool
62operator<(const LteFlowId_t& a, const LteFlowId_t& b)
63{
64 return ((a.m_rnti < b.m_rnti) || ((a.m_rnti == b.m_rnti) && (a.m_lcId < b.m_lcId)));
65}
66
68{
69}
70
71ImsiLcidPair_t::ImsiLcidPair_t(const uint64_t a, const uint8_t b)
72 : m_imsi(a),
73 m_lcId(b)
74{
75}
76
84bool
86{
87 return ((a.m_imsi == b.m_imsi) && (a.m_lcId == b.m_lcId));
88}
89
97bool
98operator<(const ImsiLcidPair_t& a, const ImsiLcidPair_t& b)
99{
100 return ((a.m_imsi < b.m_imsi) || ((a.m_imsi == b.m_imsi) && (a.m_lcId < b.m_lcId)));
101}
102
104{
105}
106
114bool
116{
117 return (a.m_rnti == b.m_rnti);
118}
119
127bool
128operator<(const LteUeConfig_t& a, const LteUeConfig_t& b)
129{
130 return (a.m_rnti < b.m_rnti);
131}
132
133uint16_t
135{
136 // convert from double to fixed point notation Sxxxxxxxxxxx.xxx
137 // truncate val to notation limits
138 if (val > 4095.88)
139 {
140 val = 4095.88;
141 }
142 if (val < -4096)
143 {
144 val = -4096;
145 }
146 int16_t valFp = (int16_t)(val * 8);
147 return (valFp);
148}
149
150double
152{
153 // convert from fixed point notation Sxxxxxxxxxxx.xxx to double
154 double valD = ((int16_t)val) / 8.0;
155 return (valD);
156}
157
158double
160{
161 return (-4096); // -4096 = 0x8000 = 1000 0000 0000 0000 b
162}
163
164// static double g_lowestFpS11dot3Value = -4096; // 0x8001 (1000 0000 0000 0000)
165
168
169 0, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57,
170 67, 78, 91, 107, 125, 146, 171, 200, 234, 274, 321, 376, 440,
171 515, 603, 706, 826, 967, 1132, 1326, 1552, 1817, 2127, 2490, 2915, 3413,
172 3995, 4677, 5476, 6411, 7505, 8787, 10287, 12043, 14099, 16507, 19325, 22624, 26487,
173 31009, 36304, 42502, 49759, 58255, 68201, 79846, 93749, 109439, 128125, 150000, 150000
174
175};
176
179{
180 NS_ABORT_MSG_UNLESS(val < 64, "val = " << val << " is out of range");
181 return BufferSizeLevelBsrTable[val];
182}
183
184uint8_t
186{
187 int index = 0;
188 if (BufferSizeLevelBsrTable[63] < val)
189 {
190 index = 63;
191 }
192 else
193 {
194 while (BufferSizeLevelBsrTable[index] < val)
195 {
196 NS_ASSERT(index < 64);
197 index++;
198 }
199 }
200
201 return (index);
202}
203
204uint8_t
206{
207 uint8_t nLayer = 0;
208 switch (txMode)
209 {
210 case 0: // Tx MODE 1: SISO
211 nLayer = 1;
212 break;
213 case 1: // Tx MODE 2: MIMO Tx Diversity
214 nLayer = 1;
215 break;
216 case 2: // Tx MODE 3: MIMO Spatial Multiplexity Open Loop
217 nLayer = 2;
218 break;
219 case 3: // Tx MODE 4: MIMO Spatial Multiplexity Closed Loop
220 nLayer = 2;
221 break;
222 case 4: // Tx MODE 5: MIMO Multi-User
223 nLayer = 2;
224 break;
225 case 5: // Tx MODE 6: Closer loop single layer percoding
226 nLayer = 1;
227 break;
228 case 6: // Tx MODE 7: Single antenna port 5
229 nLayer = 1;
230 break;
231 }
232 return (nLayer);
233}
234
235double
237{
238 // 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
239 NS_ASSERT_MSG(range <= 97, "value " << range << " is out of range");
240 return (double)range - 141.0;
241}
242
243uint8_t
245{
246 // 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
247 double range = std::min(std::max(std::floor(dbm + 141), 0.0), 97.0);
248 return (uint8_t)range;
249}
250
251double
253{
254 // 3GPP TS 36.133 section 9.1.7 RSRQ Measurement Report Mapping
255 NS_ASSERT_MSG(range <= 34, "value " << (uint16_t)range << " is out of range");
256 return ((double)range - 40.0) * 0.5;
257}
258
259uint8_t
261{
262 // 3GPP TS 36.133 section 9.1.7 RSRQ Measurement Report Mapping
263 double range = std::min(std::max(std::floor(db * 2 + 40), 0.0), 34.0);
264 return (uint8_t)range;
265}
266
267double
269{
270 return RsrpRange2Dbm(Dbm2RsrpRange(v));
271}
272
273double
275{
276 return RsrqRange2Db(Db2RsrqRange(v));
277}
278
279double
281{
282 if (hysteresisIeValue > 30)
283 {
284 NS_FATAL_ERROR("The value " << (uint16_t)hysteresisIeValue
285 << " is out of the allowed range (0..30)"
286 << " for Hysteresis IE value");
287 }
288
289 double actual = static_cast<double>(hysteresisIeValue) * 0.5;
290 NS_ASSERT(actual >= 0.0);
291 NS_ASSERT(actual <= 15.0);
292 return actual;
293}
294
295uint8_t
297{
298 if ((hysteresisDb < 0.0) || (hysteresisDb > 15.0))
299 {
300 NS_FATAL_ERROR("The value " << hysteresisDb << " is out of the allowed range (0..15) dB"
301 << " for hysteresis");
302 }
303
304 uint8_t ieValue = lround(hysteresisDb * 2.0);
305 NS_ASSERT(ieValue <= 30);
306 return ieValue;
307}
308
309double
311{
312 if ((a3OffsetIeValue < -30) || (a3OffsetIeValue > 30))
313 {
314 NS_FATAL_ERROR("The value " << (int16_t)a3OffsetIeValue
315 << " is out of the allowed range (-30..30)"
316 << " for a3-Offset IE value");
317 }
318
319 double actual = static_cast<double>(a3OffsetIeValue) * 0.5;
320 NS_ASSERT(actual >= -15.0);
321 NS_ASSERT(actual <= 15.0);
322 return actual;
323}
324
325int8_t
327{
328 if ((a3OffsetDb < -15.0) || (a3OffsetDb > 15.0))
329 {
330 NS_FATAL_ERROR("The value " << a3OffsetDb << " is out of the allowed range (-15..15) dB"
331 << " for A3 Offset");
332 }
333
334 int8_t ieValue = lround(a3OffsetDb * 2.0);
335 NS_ASSERT(ieValue >= -30);
336 NS_ASSERT(ieValue <= 30);
337 return ieValue;
338}
339
340double
342{
343 if ((qRxLevMinIeValue < -70) || (qRxLevMinIeValue > -22))
344 {
345 NS_FATAL_ERROR("The value " << (int16_t)qRxLevMinIeValue
346 << " is out of the allowed range (-70..-22)"
347 << " for Q-RxLevMin IE value");
348 }
349
350 double actual = static_cast<double>(qRxLevMinIeValue) * 2;
351 NS_ASSERT(actual >= -140.0);
352 NS_ASSERT(actual <= -44.0);
353 return actual;
354}
355
356double
358{
359 if ((qQualMinIeValue < -34) || (qQualMinIeValue > -3))
360 {
361 NS_FATAL_ERROR("The value " << (int16_t)qQualMinIeValue
362 << " is out of the allowed range (-34..-3)"
363 << " for Q-QualMin IE value");
364 }
365
366 double actual = static_cast<double>(qQualMinIeValue);
367 NS_ASSERT(actual >= -34.0);
368 NS_ASSERT(actual <= -3.0);
369 return actual;
370}
371
372}; // namespace ns3
#define min(a, b)
Definition: 80211b.c:42
#define max(a, b)
Definition: 80211b.c:43
static uint8_t BufferSize2BsrId(uint32_t val)
Convert Buffer size to BSR ID.
Definition: lte-common.cc:185
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
Definition: lte-common.cc:178
static double QuantizeRsrp(double v)
Quantize an RSRP value according to the measurement mapping of TS 36.133.
Definition: lte-common.cc:268
static int8_t ActualA3Offset2IeValue(double a3OffsetDb)
Returns the IE value of a3-Offset.
Definition: lte-common.cc:326
static uint8_t Dbm2RsrpRange(double dbm)
convert an RSRP value in dBm to the corresponding range as per 3GPP TS 36.133 section 9....
Definition: lte-common.cc:244
static uint8_t ActualHysteresis2IeValue(double hysteresisDb)
Returns the IE value of hysteresis.
Definition: lte-common.cc:296
static double RsrpRange2Dbm(uint8_t range)
converts an RSRP range to dBm as per 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
Definition: lte-common.cc:236
static double RsrqRange2Db(uint8_t range)
converts an RSRQ range to dB as per 3GPP TS 36.133 section 9.1.7 RSRQ Measurement Report Mapping
Definition: lte-common.cc:252
static double QuantizeRsrq(double v)
Quantize an RSRQ value according to the measurement mapping of TS 36.133.
Definition: lte-common.cc:274
static double IeValue2ActualQQualMin(int8_t qQualMinIeValue)
Returns the actual value of an Q-QualMin parameter.
Definition: lte-common.cc:357
static double IeValue2ActualQRxLevMin(int8_t qRxLevMinIeValue)
Returns the actual value of an Q-RxLevMin parameter.
Definition: lte-common.cc:341
static double IeValue2ActualHysteresis(uint8_t hysteresisIeValue)
Returns the actual value of a hysteresis parameter.
Definition: lte-common.cc:280
static uint8_t Db2RsrqRange(double db)
convert an RSRQ value in dB to the corresponding range as per 3GPP TS 36.133 section 9....
Definition: lte-common.cc:260
static double IeValue2ActualA3Offset(int8_t a3OffsetIeValue)
Returns the actual value of an a3-Offset parameter.
Definition: lte-common.cc:310
static double getMinFpS11dot3Value()
Get minimum fixed point S11.3 value.
Definition: lte-common.cc:159
static uint16_t double2fpS11dot3(double val)
Convert from double to fixed point S11.3 notation.
Definition: lte-common.cc:134
static double fpS11dot3toDouble(uint16_t val)
Convert from fixed point S11.3 notation to double.
Definition: lte-common.cc:151
static uint8_t TxMode2LayerNum(uint8_t txMode)
Transmit mode 2 layer number.
Definition: lte-common.cc:205
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:66
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:86
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
Definition: abort.h:144
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:160
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool operator==(const EventId &a, const EventId &b)
Definition: event-id.h:157
static const uint32_t BufferSizeLevelBsrTable[64]
Buffer size level BSR table.
Definition: lte-common.cc:167
bool operator<(const EventId &a, const EventId &b)
Definition: event-id.h:170
ImsiLcidPair structure.
Definition: lte-common.h:57
uint8_t m_lcId
LCID.
Definition: lte-common.h:59
uint64_t m_imsi
IMSI.
Definition: lte-common.h:58
LteFlowId structure.
Definition: lte-common.h:37
uint8_t m_lcId
LCID.
Definition: lte-common.h:39
uint16_t m_rnti
RNTI.
Definition: lte-common.h:38
Parameters for configuring the UE.
Definition: lte-common.h:79
uint16_t m_rnti
RNTI.
Definition: lte-common.h:83