A Discrete-Event Network Simulator
API
lte-stats-calculator.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: Jaume Nin <jnin@cttc.es>
19 */
20
22
23#include <ns3/log.h>
24#include <ns3/config.h>
25#include <ns3/lte-enb-rrc.h>
26#include <ns3/lte-ue-rrc.h>
27#include <ns3/lte-enb-net-device.h>
28#include <ns3/lte-ue-net-device.h>
29
30namespace ns3 {
31
32NS_LOG_COMPONENT_DEFINE ("LteStatsCalculator");
33
34NS_OBJECT_ENSURE_REGISTERED (LteStatsCalculator);
35
37 : m_dlOutputFilename (""),
38 m_ulOutputFilename ("")
39{
40 // Nothing to do here
41
42}
43
45{
46 // Nothing to do here
47}
48
49
52{
53 static TypeId tid = TypeId ("ns3::LteStatsCalculator")
54 .SetParent<Object> ()
55 .SetGroupName("Lte")
56 .AddConstructor<LteStatsCalculator> ()
57 ;
58 return tid;
59}
60
61
62void
63LteStatsCalculator::SetUlOutputFilename (std::string outputFilename)
64{
65 m_ulOutputFilename = outputFilename;
66}
67
68std::string
70{
71 return m_ulOutputFilename;
72}
73
74void
75LteStatsCalculator::SetDlOutputFilename (std::string outputFilename)
76{
77 m_dlOutputFilename = outputFilename;
78}
79
80std::string
82{
83 return m_dlOutputFilename;
84}
85
86
87bool
89{
90 if (m_pathImsiMap.find (path) == m_pathImsiMap.end () )
91 {
92 return false;
93 }
94 else
95 {
96 return true;
97 }
98}
99
100void
101LteStatsCalculator::SetImsiPath (std::string path, uint64_t imsi)
102{
103 NS_LOG_FUNCTION (this << path << imsi);
104 m_pathImsiMap[path] = imsi;
105}
106
107uint64_t
109{
110 return m_pathImsiMap.find (path)->second;
111}
112
113bool
115{
116 if (m_pathCellIdMap.find (path) == m_pathCellIdMap.end () )
117 {
118 return false;
119 }
120 else
121 {
122 return true;
123 }
124}
125
126void
127LteStatsCalculator::SetCellIdPath (std::string path, uint16_t cellId)
128{
129 NS_LOG_FUNCTION (this << path << cellId);
130 m_pathCellIdMap[path] = cellId;
131}
132
133uint16_t
135{
136 return m_pathCellIdMap.find (path)->second;
137}
138
139
140uint64_t
142{
143 NS_LOG_FUNCTION (path);
144 // Sample path input:
145 // /NodeList/#NodeId/DeviceList/#DeviceId/LteEnbRrc/UeMap/#C-RNTI/DataRadioBearerMap/#LCID/LteRlc/RxPDU
146
147 // We retrieve the UeManager associated to the C-RNTI and perform the IMSI lookup
148 std::string ueMapPath = path.substr (0, path.find ("/DataRadioBearerMap"));
150
151 if (match.GetN () != 0)
152 {
153 Ptr<Object> ueInfo = match.Get (0);
154 NS_LOG_LOGIC ("FindImsiFromEnbRlcPath: " << path << ", " << ueInfo->GetObject<UeManager> ()->GetImsi ());
155 return ueInfo->GetObject<UeManager> ()->GetImsi ();
156 }
157 else
158 {
159 NS_FATAL_ERROR ("Lookup " << ueMapPath << " got no matches");
160 }
161}
162
163uint64_t
165{
166 NS_LOG_FUNCTION (path);
167 // Sample path input:
168 // /NodeList/#NodeId/DeviceList/#DeviceId/LteUePhy
169
170 // We retrieve the UeInfo associated to the C-RNTI and perform the IMSI lookup
171 std::string ueRlcPath = path.substr (0, path.find ("/LteUePhy"));
172 ueRlcPath += "/LteUeRrc";
174
175 if (match.GetN () != 0)
176 {
177 Ptr<Object> ueRrc = match.Get (0);
178 return ueRrc->GetObject<LteUeRrc> ()->GetImsi ();
179 }
180 else
181 {
182 NS_FATAL_ERROR ("Lookup " << ueRlcPath << " got no matches");
183 }
184 return 0;
185}
186
187
188uint64_t
190{
191 NS_LOG_FUNCTION (path);
192 // Sample path input:
193 // /NodeList/#NodeId/DeviceList/#DeviceId/
194
195 // We retrieve the Imsi associated to the LteUeNetDevice
197
198 if (match.GetN () != 0)
199 {
200 Ptr<Object> ueNetDevice = match.Get (0);
201 NS_LOG_LOGIC ("FindImsiFromLteNetDevice: " << path << ", " << ueNetDevice->GetObject<LteUeNetDevice> ()->GetImsi ());
202 return ueNetDevice->GetObject<LteUeNetDevice> ()->GetImsi ();
203 }
204 else
205 {
206 NS_FATAL_ERROR ("Lookup " << path << " got no matches");
207 }
208}
209
210uint16_t
212{
213 NS_LOG_FUNCTION (path);
214 // Sample path input:
215 // /NodeList/#NodeId/DeviceList/#DeviceId/LteEnbRrc/UeMap/#C-RNTI/DataRadioBearerMap/#LCID/LteRlc/RxPDU
216
217 // We retrieve the CellId associated to the Enb
218 std::string enbNetDevicePath = path.substr (0, path.find ("/LteEnbRrc"));
219 Config::MatchContainer match = Config::LookupMatches (enbNetDevicePath);
220 if (match.GetN () != 0)
221 {
222 Ptr<Object> enbNetDevice = match.Get (0);
223 NS_LOG_LOGIC ("FindCellIdFromEnbRlcPath: " << path << ", " << enbNetDevice->GetObject<LteEnbNetDevice> ()->GetCellId ());
224 return enbNetDevice->GetObject<LteEnbNetDevice> ()->GetCellId ();
225 }
226 else
227 {
228 NS_FATAL_ERROR ("Lookup " << enbNetDevicePath << " got no matches");
229 }
230}
231
232uint64_t
233LteStatsCalculator::FindImsiFromEnbMac (std::string path, uint16_t rnti)
234{
235 NS_LOG_FUNCTION (path << rnti);
236
237 // /NodeList/#NodeId/DeviceList/#DeviceId/LteEnbMac/DlScheduling
238 std::ostringstream oss;
239 std::string p = path.substr (0, path.find ("/LteEnbMac"));
240 oss << rnti;
241 p += "/LteEnbRrc/UeMap/" + oss.str ();
242 uint64_t imsi = FindImsiFromEnbRlcPath (p);
243 NS_LOG_LOGIC ("FindImsiFromEnbMac: " << path << ", " << rnti << ", " << imsi);
244 return imsi;
245}
246
247uint16_t
248LteStatsCalculator::FindCellIdFromEnbMac (std::string path, uint16_t rnti)
249{
250 NS_LOG_FUNCTION (path << rnti);
251 // /NodeList/#NodeId/DeviceList/#DeviceId/LteEnbMac/DlScheduling
252 std::ostringstream oss;
253 std::string p = path.substr (0, path.find ("/LteEnbMac"));
254 oss << rnti;
255 p += "/LteEnbRrc/UeMap/" + oss.str ();
256 uint16_t cellId = FindCellIdFromEnbRlcPath (p);
257 NS_LOG_LOGIC ("FindCellIdFromEnbMac: " << path << ", "<< rnti << ", " << cellId);
258 return cellId;
259}
260
261
262uint64_t
263LteStatsCalculator::FindImsiForEnb (std::string path, uint16_t rnti)
264{
265 NS_LOG_FUNCTION (path << rnti);
266 uint64_t imsi = 0;
267 if (path.find ("/DlPhyTransmission"))
268 {
269 // /NodeList/0/DeviceList/0/LteEnbPhy/DlPhyTransmission/LteEnbRrc/UeMap/1
270 std::ostringstream oss;
271 std::string p = path.substr (0, path.find ("/LteEnbPhy"));
272 oss << rnti;
273 p += "/LteEnbRrc/UeMap/" + oss.str ();
274 imsi = FindImsiFromEnbRlcPath (p);
275 NS_LOG_LOGIC ("FindImsiForEnb[Tx]: " << path << ", " << rnti << ", " << imsi);
276 }
277 else if (path.find ("/UlPhyReception"))
278 {
279 std::string p = path.substr (0, path.find ("/LteUePhy"));
280 imsi = FindImsiFromLteNetDevice (p);
281 NS_LOG_LOGIC ("FindImsiForEnb[Rx]: " << path << ", " << rnti << ", " << imsi);
282 }
283 return imsi;
284}
285
286
287uint64_t
288LteStatsCalculator::FindImsiForUe (std::string path, uint16_t rnti)
289{
290 NS_LOG_FUNCTION (path << rnti);
291 uint64_t imsi = 0;
292 if (path.find ("/UlPhyTransmission"))
293 {
294 std::string p = path.substr (0, path.find ("/LteUePhy"));
295 imsi = FindImsiFromLteNetDevice (p);
296 NS_LOG_LOGIC ("FindImsiForUe[Tx]: " << path << ", " << rnti << ", " << imsi);
297 }
298 else if (path.find ("/DlPhyReception"))
299 {
300 // /NodeList/0/DeviceList/0/LteEnbPhy/LteSpectrumPhy
301 std::ostringstream oss;
302 std::string p = path.substr (0, path.find ("/LteEnbPhy"));
303 oss << rnti;
304 p += "/LteEnbRrc/UeMap/" + oss.str ();
305 imsi = FindImsiFromEnbRlcPath (p);
306 NS_LOG_LOGIC ("FindImsiForUe[Rx]: " << path << ", " << rnti << ", " << imsi);
307 }
308 return imsi;
309}
310
311
312} // namespace ns3
hold a set of objects which match a specific search string.
Definition: config.h:193
Ptr< Object > Get(std::size_t i) const
Definition: config.cc:75
std::size_t GetN(void) const
Definition: config.cc:69
The eNodeB device implementation.
uint16_t GetCellId() const
Base class for ***StatsCalculator classes.
void SetImsiPath(std::string path, uint64_t imsi)
Stores the (path, imsi) pairs in a map.
std::string GetDlOutputFilename(void)
Get the name of the file where the downlink statistics will be stored.
void SetCellIdPath(std::string path, uint16_t cellId)
Stores the (path, cellId) pairs in a map.
bool ExistsCellIdPath(std::string path)
Checks if there is an already stored cell id for the given path.
std::string m_ulOutputFilename
Name of the file where the uplink results will be saved.
void SetDlOutputFilename(std::string outputFilename)
Set the name of the file where the downlink statistics will be stored.
static uint64_t FindImsiFromEnbRlcPath(std::string path)
Retrieves IMSI from Enb RLC path in the attribute system.
static uint64_t FindImsiForUe(std::string path, uint16_t rnti)
Retrieves IMSI from path for Ue in the attribute system.
uint64_t GetImsiPath(std::string path)
Retrieves the imsi information for the given path.
static uint64_t FindImsiFromUePhy(std::string path)
Retrieves IMSI from Ue PHY path in the attribute system.
std::map< std::string, uint64_t > m_pathImsiMap
List of IMSI by path in the attribute system.
void SetUlOutputFilename(std::string outputFilename)
Set the name of the file where the uplink statistics will be stored.
std::map< std::string, uint16_t > m_pathCellIdMap
List of CellId by path in the attribute system.
bool ExistsImsiPath(std::string path)
Checks if there is an already stored IMSI for the given path.
static uint16_t FindCellIdFromEnbRlcPath(std::string path)
Retrieves CellId from Enb RLC path in the attribute system.
virtual ~LteStatsCalculator()
Destructor.
std::string GetUlOutputFilename(void)
Get the name of the file where the uplink statistics will be stored.
static uint64_t FindImsiFromLteNetDevice(std::string path)
Retrieves IMSI from LteNetDevice path in the attribute system.
static uint16_t FindCellIdFromEnbMac(std::string path, uint16_t rnti)
Retrieves CellId from Enb MAC path in the attribute system.
uint16_t GetCellIdPath(std::string path)
Retrieves the cell id information for the given path.
std::string m_dlOutputFilename
Name of the file where the downlink results will be saved.
static uint64_t FindImsiFromEnbMac(std::string path, uint16_t rnti)
Retrieves IMSI from Enb MAC path in the attribute system.
static TypeId GetTypeId(void)
Register this type.
static uint64_t FindImsiForEnb(std::string path, uint16_t rnti)
Retrieves IMSI from path for Enb in the attribute system.
The LteUeNetDevice class implements the UE net device.
uint64_t GetImsi() const
Get the IMSI.
A base class which provides memory management and object aggregation.
Definition: object.h:88
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Manages all the radio bearer information possessed by the ENB RRC for a single UE.
Definition: lte-enb-rrc.h:75
uint64_t GetImsi(void) const
MatchContainer LookupMatches(std::string path)
Definition: config.cc:940
#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:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.