25 #include "radio-bearer-stats-connector.h"
26 #include "radio-bearer-stats-calculator.h"
27 #include <ns3/lte-enb-rrc.h>
28 #include <ns3/lte-enb-net-device.h>
29 #include <ns3/lte-ue-rrc.h>
30 #include <ns3/lte-ue-net-device.h>
40 operator < (
const RadioBearerStatsConnector::CellIdRnti& a,
const RadioBearerStatsConnector::CellIdRnti& b)
42 return ( (a.cellId < b.cellId) || ( (a.cellId == b.cellId) && (a.rnti < b.rnti) ) );
56 uint16_t rnti, uint8_t lcid, uint32_t packetSize)
58 NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize);
59 arg->stats->DlTxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize);
63 DlRxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
64 uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
66 NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize << delay);
67 arg->stats->DlRxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize, delay);
73 UlTxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
74 uint16_t rnti, uint8_t lcid, uint32_t packetSize)
76 NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize);
78 arg->stats->UlTxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize);
82 UlRxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
83 uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
85 NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize << delay);
87 arg->stats->UlRxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize, delay);
92 RadioBearerStatsConnector::RadioBearerStatsConnector ()
98 RadioBearerStatsConnector::EnableRlcStats (Ptr<RadioBearerStatsCalculator> rlcStats)
100 m_rlcStats = rlcStats;
105 RadioBearerStatsConnector::EnablePdcpStats (Ptr<RadioBearerStatsCalculator> pdcpStats)
107 m_pdcpStats = pdcpStats;
112 RadioBearerStatsConnector::EnsureConnected ()
118 MakeBoundCallback (&RadioBearerStatsConnector::NotifyNewUeContextEnb,
this));
119 Config::Connect (
"/NodeList/*/DeviceList/*/LteUeRrc/RandomAccessSuccessful",
120 MakeBoundCallback (&RadioBearerStatsConnector::NotifyRandomAccessSuccessfulUe,
this));
121 Config::Connect (
"/NodeList/*/DeviceList/*/LteEnbRrc/ConnectionReconfiguration",
122 MakeBoundCallback (&RadioBearerStatsConnector::NotifyConnectionReconfigurationEnb,
this));
123 Config::Connect (
"/NodeList/*/DeviceList/*/LteUeRrc/ConnectionReconfiguration",
124 MakeBoundCallback (&RadioBearerStatsConnector::NotifyConnectionReconfigurationUe,
this));
126 MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverStartEnb,
this));
128 MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverStartUe,
this));
130 MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverEndOkEnb,
this));
132 MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverEndOkUe,
this));
138 RadioBearerStatsConnector::NotifyRandomAccessSuccessfulUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
140 c->ConnectSrb0Traces (context, imsi, cellId, rnti);
144 RadioBearerStatsConnector::NotifyConnectionSetupUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
146 c->ConnectSrb1TracesUe (context, imsi, cellId, rnti);
150 RadioBearerStatsConnector::NotifyConnectionReconfigurationUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
152 c->ConnectTracesUeIfFirstTime (context, imsi, cellId, rnti);
156 RadioBearerStatsConnector::NotifyHandoverStartUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint16_t targetCellId)
158 c->DisconnectTracesUe (context, imsi, cellId, rnti);
162 RadioBearerStatsConnector::NotifyHandoverEndOkUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
164 c->ConnectTracesUe (context, imsi, cellId, rnti);
168 RadioBearerStatsConnector::NotifyNewUeContextEnb (RadioBearerStatsConnector* c, std::string context, uint16_t cellId, uint16_t rnti)
170 c->StoreUeManagerPath (context, cellId, rnti);
174 RadioBearerStatsConnector::NotifyConnectionReconfigurationEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
176 c->ConnectTracesEnbIfFirstTime (context, imsi, cellId, rnti);
180 RadioBearerStatsConnector::NotifyHandoverStartEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint16_t targetCellId)
182 c->DisconnectTracesEnb (context, imsi, cellId, rnti);
186 RadioBearerStatsConnector::NotifyHandoverEndOkEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
188 c->ConnectTracesEnb (context, imsi, cellId, rnti);
192 RadioBearerStatsConnector::StoreUeManagerPath (std::string context, uint16_t cellId, uint16_t rnti)
195 std::ostringstream ueManagerPath;
196 ueManagerPath << context.substr (0, context.rfind (
"/")) <<
"/UeMap/" << (uint32_t) rnti;
200 m_ueManagerPathByCellIdRnti[key] = ueManagerPath.str ();
204 RadioBearerStatsConnector::ConnectSrb0Traces (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
207 std::string ueRrcPath = context.substr (0, context.rfind (
"/"));
211 std::map<CellIdRnti, std::string>::iterator it = m_ueManagerPathByCellIdRnti.find (key);
212 NS_ASSERT (it != m_ueManagerPathByCellIdRnti.end ());
213 std::string ueManagerPath = it->second;
214 NS_LOG_LOGIC (
this <<
" ueManagerPath: " << ueManagerPath);
215 m_ueManagerPathByCellIdRnti.erase (it);
219 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
221 arg->cellId = cellId;
222 arg->stats = m_rlcStats;
226 MakeBoundCallback (&UlTxPduCallback, arg));
228 MakeBoundCallback (&DlRxPduCallback, arg));
230 MakeBoundCallback (&DlTxPduCallback, arg));
232 MakeBoundCallback (&UlRxPduCallback, arg));
236 MakeBoundCallback (&UlTxPduCallback, arg));
238 MakeBoundCallback (&DlRxPduCallback, arg));
240 MakeBoundCallback (&DlTxPduCallback, arg));
242 MakeBoundCallback (&UlRxPduCallback, arg));
246 MakeBoundCallback (&DlTxPduCallback, arg));
248 MakeBoundCallback (&UlRxPduCallback, arg));
252 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
254 arg->cellId = cellId;
255 arg->stats = m_pdcpStats;
259 MakeBoundCallback (&UlRxPduCallback, arg));
261 MakeBoundCallback (&DlTxPduCallback, arg));
266 RadioBearerStatsConnector::ConnectSrb1TracesUe (std::string ueRrcPath, uint64_t imsi, uint16_t cellId, uint16_t rnti)
271 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
273 arg->cellId = cellId;
274 arg->stats = m_rlcStats;
276 MakeBoundCallback (&UlTxPduCallback, arg));
278 MakeBoundCallback (&DlRxPduCallback, arg));
282 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
284 arg->cellId = cellId;
285 arg->stats = m_pdcpStats;
287 MakeBoundCallback (&DlRxPduCallback, arg));
289 MakeBoundCallback (&UlTxPduCallback, arg));
294 RadioBearerStatsConnector::ConnectTracesUeIfFirstTime (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
297 if (m_imsiSeenUe.find (imsi) == m_imsiSeenUe.end ())
299 m_imsiSeenUe.insert (imsi);
300 ConnectTracesUe (context, imsi, cellId, rnti);
305 RadioBearerStatsConnector::ConnectTracesEnbIfFirstTime (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
308 if (m_imsiSeenEnb.find (imsi) == m_imsiSeenEnb.end ())
310 m_imsiSeenEnb.insert (imsi);
311 ConnectTracesEnb (context, imsi, cellId, rnti);
316 RadioBearerStatsConnector::ConnectTracesUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
319 NS_LOG_LOGIC (
this <<
"expected context should match /NodeList/*/DeviceList/*/LteUeRrc/");
320 std::string basePath = context.substr (0, context.rfind (
"/"));
323 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
325 arg->cellId = cellId;
326 arg->stats = m_rlcStats;
328 MakeBoundCallback (&UlTxPduCallback, arg));
330 MakeBoundCallback (&DlRxPduCallback, arg));
332 MakeBoundCallback (&UlTxPduCallback, arg));
334 MakeBoundCallback (&DlRxPduCallback, arg));
339 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
341 arg->cellId = cellId;
342 arg->stats = m_pdcpStats;
344 MakeBoundCallback (&DlRxPduCallback, arg));
346 MakeBoundCallback (&UlTxPduCallback, arg));
348 MakeBoundCallback (&DlRxPduCallback, arg));
350 MakeBoundCallback (&UlTxPduCallback, arg));
355 RadioBearerStatsConnector::ConnectTracesEnb (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
358 NS_LOG_LOGIC (
this <<
"expected context should match /NodeList/*/DeviceList/*/LteEnbRrc/");
359 std::ostringstream basePath;
360 basePath << context.substr (0, context.rfind (
"/")) <<
"/UeMap/" << (uint32_t) rnti;
363 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
365 arg->cellId = cellId;
366 arg->stats = m_rlcStats;
367 Config::Connect (basePath.str () +
"/DataRadioBearerMap/*/LteRlc/RxPDU",
368 MakeBoundCallback (&UlRxPduCallback, arg));
369 Config::Connect (basePath.str () +
"/DataRadioBearerMap/*/LteRlc/TxPDU",
370 MakeBoundCallback (&DlTxPduCallback, arg));
372 MakeBoundCallback (&UlRxPduCallback, arg));
374 MakeBoundCallback (&DlTxPduCallback, arg));
376 MakeBoundCallback (&UlRxPduCallback, arg));
378 MakeBoundCallback (&DlTxPduCallback, arg));
382 Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
384 arg->cellId = cellId;
385 arg->stats = m_pdcpStats;
386 Config::Connect (basePath.str () +
"/DataRadioBearerMap/*/LtePdcp/TxPDU",
387 MakeBoundCallback (&DlTxPduCallback, arg));
388 Config::Connect (basePath.str () +
"/DataRadioBearerMap/*/LtePdcp/RxPDU",
389 MakeBoundCallback (&UlRxPduCallback, arg));
391 MakeBoundCallback (&DlTxPduCallback, arg));
393 MakeBoundCallback (&UlRxPduCallback, arg));
398 RadioBearerStatsConnector::DisconnectTracesUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
405 RadioBearerStatsConnector::DisconnectTracesEnb (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
void Disconnect(std::string path, const CallbackBase &cb)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
void Connect(std::string path, const CallbackBase &cb)
#define NS_LOG_LOGIC(msg)
A template-based reference counting class.