A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
21 #include "lte-stats-calculator.h"
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 
30 namespace ns3 {
31 
32 NS_LOG_COMPONENT_DEFINE ("LteStatsCalculator");
33 
34 NS_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 
50 TypeId
52 {
53  static TypeId tid = TypeId ("ns3::LteStatsCalculator")
54  .SetParent<Object> ()
55  .SetGroupName("Lte")
56  .AddConstructor<LteStatsCalculator> ()
57  ;
58  return tid;
59 }
60 
61 
62 void
63 LteStatsCalculator::SetUlOutputFilename (std::string outputFilename)
64 {
65  m_ulOutputFilename = outputFilename;
66 }
67 
68 std::string
70 {
71  return m_ulOutputFilename;
72 }
73 
74 void
75 LteStatsCalculator::SetDlOutputFilename (std::string outputFilename)
76 {
77  m_dlOutputFilename = outputFilename;
78 }
79 
80 std::string
82 {
83  return m_dlOutputFilename;
84 }
85 
86 
87 bool
89 {
90  if (m_pathImsiMap.find (path) == m_pathImsiMap.end () )
91  {
92  return false;
93  }
94  else
95  {
96  return true;
97  }
98 }
99 
100 void
101 LteStatsCalculator::SetImsiPath (std::string path, uint64_t imsi)
102 {
103  NS_LOG_FUNCTION (this << path << imsi);
104  m_pathImsiMap[path] = imsi;
105 }
106 
107 uint64_t
109 {
110  return m_pathImsiMap.find (path)->second;
111 }
112 
113 bool
115 {
116  if (m_pathCellIdMap.find (path) == m_pathCellIdMap.end () )
117  {
118  return false;
119  }
120  else
121  {
122  return true;
123  }
124 }
125 
126 void
127 LteStatsCalculator::SetCellIdPath (std::string path, uint16_t cellId)
128 {
129  NS_LOG_FUNCTION (this << path << cellId);
130  m_pathCellIdMap[path] = cellId;
131 }
132 
133 uint16_t
135 {
136  return m_pathCellIdMap.find (path)->second;
137 }
138 
139 
140 uint64_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"));
149  Config::MatchContainer match = Config::LookupMatches (ueMapPath);
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 
163 uint64_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";
173  Config::MatchContainer match = Config::LookupMatches (ueRlcPath);
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 
188 uint64_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 
210 uint16_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 
232 uint64_t
233 LteStatsCalculator::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 
247 uint16_t
248 LteStatsCalculator::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 
262 uint64_t
263 LteStatsCalculator::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 
287 uint64_t
288 LteStatsCalculator::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
Base class for ***StatsCalculator classes.
static uint64_t FindImsiFromLteNetDevice(std::string path)
Retrieves IMSI from LteNetDevice path in the attribute system.
static uint64_t FindImsiFromUePhy(std::string path)
Retrieves IMSI from Ue PHY path in the attribute system.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
static uint64_t FindImsiFromEnbMac(std::string path, uint16_t rnti)
Retrieves IMSI from Enb MAC path in the attribute system.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:44
uint16_t GetCellId() const
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:455
void SetCellIdPath(std::string path, uint16_t cellId)
Stores the (path, cellId) pairs in a map.
uint64_t GetImsi() const
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
static uint16_t FindCellIdFromEnbRlcPath(std::string path)
Retrieves CellId from Enb RLC path in the attribute system.
static TypeId GetTypeId(void)
Register this type.
static uint16_t FindCellIdFromEnbMac(std::string path, uint16_t rnti)
Retrieves CellId from Enb MAC 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.
static uint64_t FindImsiForEnb(std::string path, uint16_t rnti)
Retrieves IMSI from path for Enb in the attribute system.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:252
uint32_t GetN(void) const
Definition: config.cc:69
std::string GetUlOutputFilename(void)
Get the name of the file where the uplink statistics will be stored.
Manages all the radio bearer information possessed by the ENB RRC for a single UE.
Definition: lte-enb-rrc.h:62
bool ExistsCellIdPath(std::string path)
Checks if there is an already stored cell id for the given path.
void SetDlOutputFilename(std::string outputFilename)
Set the name of the file where the downlink statistics will be stored.
Ptr< Object > Get(uint32_t i) const
Definition: config.cc:75
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.
hold a set of objects which match a specific search string.
Definition: config.h:151
uint16_t GetCellIdPath(std::string path)
Retrieves the cell id information for the given path.
uint64_t GetImsi(void) const
uint64_t GetImsiPath(std::string path)
Retrieves the imsi information for the given path.
Config::MatchContainer LookupMatches(std::string path)
Definition: config.cc:846
std::map< std::string, uint16_t > m_pathCellIdMap
List of CellId by path in the attribute system.
virtual ~LteStatsCalculator()
Destructor.
std::string m_dlOutputFilename
Name of the file where the downlink results will be saved.
void SetImsiPath(std::string path, uint64_t imsi)
Stores the (path, imsi) pairs in a map.
A base class which provides memory management and object aggregation.
Definition: object.h:87
std::string m_ulOutputFilename
Name of the file where the uplink results will be saved.
The eNodeB device implementation.
a unique identifier for an interface.
Definition: type-id.h:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:827
bool ExistsImsiPath(std::string path)
Checks if there is an already stored IMSI for the given path.
std::string GetDlOutputFilename(void)
Get the name of the file where the downlink statistics will be stored.
The LteUeNetDevice class implements the UE net device.