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