6#include "nr-bearer-stats-connector.h"
8#include "nr-bearer-stats-calculator.h"
10#include <ns3/config.h>
16NS_LOG_COMPONENT_DEFINE(
"NrBearerStatsConnector");
22operator<(
const NrBearerStatsConnector::CellIdRnti& a,
const NrBearerStatsConnector::CellIdRnti& b)
24 return ((a.cellId < b.cellId) || ((a.cellId == b.cellId) && (a.rnti < b.rnti)));
33struct NrBoundCallbackArgument :
public SimpleRefCount<NrBoundCallbackArgument>
36 Ptr<NrBearerStatsBase> stats;
50DlTxPduCallback(Ptr<NrBoundCallbackArgument> arg,
56 NS_LOG_FUNCTION(path << rnti << (uint16_t)lcid << packetSize);
57 arg->stats->DlTxPdu(arg->cellId, arg->imsi, rnti, lcid, packetSize);
70DlRxPduCallback(Ptr<NrBoundCallbackArgument> arg,
77 NS_LOG_FUNCTION(path << rnti << (uint16_t)lcid << packetSize << delay);
78 arg->stats->DlRxPdu(arg->cellId, arg->imsi, rnti, lcid, packetSize, delay);
90UlTxPduCallback(Ptr<NrBoundCallbackArgument> arg,
96 NS_LOG_FUNCTION(path << rnti << (uint16_t)lcid << packetSize);
98 arg->stats->UlTxPdu(arg->cellId, arg->imsi, rnti, lcid, packetSize);
111UlRxPduCallback(Ptr<NrBoundCallbackArgument> arg,
118 NS_LOG_FUNCTION(path << rnti << (uint16_t)lcid << packetSize << delay);
120 arg->stats->UlRxPdu(arg->cellId, arg->imsi, rnti, lcid, packetSize, delay);
131 m_rlcStats = rlcStats;
138 m_pdcpStats = pdcpStats;
145 NS_LOG_FUNCTION(
this);
148 Config::Connect(
"/NodeList/*/DeviceList/*/NrGnbRrc/NewUeContext",
151 "/NodeList/*/DeviceList/*/NrUeRrc/RandomAccessSuccessful",
154 "/NodeList/*/DeviceList/*/NrGnbRrc/ConnectionReconfiguration",
157 "/NodeList/*/DeviceList/*/NrUeRrc/ConnectionReconfiguration",
159 Config::Connect(
"/NodeList/*/DeviceList/*/NrGnbRrc/HandoverStart",
161 Config::Connect(
"/NodeList/*/DeviceList/*/NrUeRrc/HandoverStart",
163 Config::Connect(
"/NodeList/*/DeviceList/*/NrGnbRrc/HandoverEndOk",
165 Config::Connect(
"/NodeList/*/DeviceList/*/NrUeRrc/HandoverEndOk",
178 c->ConnectSrb0Traces(context, imsi, cellId, rnti);
188 c->ConnectSrb1TracesUe(context, imsi, cellId, rnti);
198 c->ConnectTracesUeIfFirstTime(context, imsi, cellId, rnti);
207 uint16_t targetCellId)
209 c->DisconnectTracesUe(context, imsi, cellId, rnti);
219 c->ConnectTracesUe(context, imsi, cellId, rnti);
228 c->StoreUeManagerPath(context, cellId, rnti);
238 c->ConnectTracesGnbIfFirstTime(context, imsi, cellId, rnti);
247 uint16_t targetCellId)
249 c->DisconnectTracesGnb(context, imsi, cellId, rnti);
259 c->ConnectTracesGnb(context, imsi, cellId, rnti);
263NrBearerStatsConnector::StoreUeManagerPath(std::string context, uint16_t cellId, uint16_t rnti)
265 NS_LOG_FUNCTION(
this << context << cellId << rnti);
266 std::ostringstream ueManagerPath;
267 ueManagerPath << context.substr(0, context.rfind(
'/')) <<
"/UeMap/" << (uint32_t)rnti;
271 m_ueManagerPathByCellIdRnti[key] = ueManagerPath.str();
275NrBearerStatsConnector::ConnectSrb0Traces(std::string context,
280 NS_LOG_FUNCTION(
this << imsi << cellId << rnti);
281 std::string ueRrcPath = context.substr(0, context.rfind(
'/'));
285 std::map<CellIdRnti, std::string>::iterator it = m_ueManagerPathByCellIdRnti.find(key);
286 NS_ASSERT(it != m_ueManagerPathByCellIdRnti.end());
287 std::string ueManagerPath = it->second;
288 NS_LOG_LOGIC(
this <<
" ueManagerPath: " << ueManagerPath);
289 m_ueManagerPathByCellIdRnti.erase(it);
293 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
295 arg->cellId = cellId;
296 arg->stats = m_rlcStats;
299 Config::Disconnect(ueRrcPath +
"/Srb0/NrRlc/TxPDU",
300 MakeBoundCallback(&UlTxPduCallback, arg));
301 Config::Disconnect(ueRrcPath +
"/Srb0/NrRlc/RxPDU",
302 MakeBoundCallback(&DlRxPduCallback, arg));
303 Config::Disconnect(ueManagerPath +
"/Srb0/NrRlc/TxPDU",
304 MakeBoundCallback(&DlTxPduCallback, arg));
305 Config::Disconnect(ueManagerPath +
"/Srb0/NrRlc/RxPDU",
306 MakeBoundCallback(&UlRxPduCallback, arg));
309 Config::Connect(ueRrcPath +
"/Srb0/NrRlc/TxPDU", MakeBoundCallback(&UlTxPduCallback, arg));
310 Config::Connect(ueRrcPath +
"/Srb0/NrRlc/RxPDU", MakeBoundCallback(&DlRxPduCallback, arg));
311 Config::Connect(ueManagerPath +
"/Srb0/NrRlc/TxPDU",
312 MakeBoundCallback(&DlTxPduCallback, arg));
313 Config::Connect(ueManagerPath +
"/Srb0/NrRlc/RxPDU",
314 MakeBoundCallback(&UlRxPduCallback, arg));
317 Config::Connect(ueManagerPath +
"/Srb1/NrRlc/TxPDU",
318 MakeBoundCallback(&DlTxPduCallback, arg));
319 Config::Connect(ueManagerPath +
"/Srb1/NrRlc/RxPDU",
320 MakeBoundCallback(&UlRxPduCallback, arg));
324 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
326 arg->cellId = cellId;
327 arg->stats = m_pdcpStats;
330 Config::Connect(ueManagerPath +
"/Srb1/NrPdcp/RxPDU",
331 MakeBoundCallback(&UlRxPduCallback, arg));
332 Config::Connect(ueManagerPath +
"/Srb1/NrPdcp/TxPDU",
333 MakeBoundCallback(&DlTxPduCallback, arg));
338NrBearerStatsConnector::ConnectSrb1TracesUe(std::string ueRrcPath,
343 NS_LOG_FUNCTION(
this << imsi << cellId << rnti);
346 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
348 arg->cellId = cellId;
349 arg->stats = m_rlcStats;
350 Config::Connect(ueRrcPath +
"/Srb1/NrRlc/TxPDU", MakeBoundCallback(&UlTxPduCallback, arg));
351 Config::Connect(ueRrcPath +
"/Srb1/NrRlc/RxPDU", MakeBoundCallback(&DlRxPduCallback, arg));
355 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
357 arg->cellId = cellId;
358 arg->stats = m_pdcpStats;
359 Config::Connect(ueRrcPath +
"/Srb1/NrPdcp/RxPDU", MakeBoundCallback(&DlRxPduCallback, arg));
360 Config::Connect(ueRrcPath +
"/Srb1/NrPdcp/TxPDU", MakeBoundCallback(&UlTxPduCallback, arg));
365NrBearerStatsConnector::ConnectTracesUeIfFirstTime(std::string context,
370 NS_LOG_FUNCTION(
this << context);
371 if (m_imsiSeenUe.find(imsi) == m_imsiSeenUe.end())
373 m_imsiSeenUe.insert(imsi);
374 ConnectTracesUe(context, imsi, cellId, rnti);
379NrBearerStatsConnector::ConnectTracesGnbIfFirstTime(std::string context,
384 NS_LOG_FUNCTION(
this << context);
385 if (m_imsiSeenGnb.find(imsi) == m_imsiSeenGnb.end())
387 m_imsiSeenGnb.insert(imsi);
388 ConnectTracesGnb(context, imsi, cellId, rnti);
393NrBearerStatsConnector::ConnectTracesUe(std::string context,
398 NS_LOG_FUNCTION(
this << context);
399 NS_LOG_LOGIC(
this <<
"expected context should match /NodeList/*/DeviceList/*/NrUeRrc/");
400 std::string basePath = context.substr(0, context.rfind(
'/'));
403 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
405 arg->cellId = cellId;
406 arg->stats = m_rlcStats;
407 Config::Connect(basePath +
"/DataRadioBearerMap/*/NrRlc/TxPDU",
408 MakeBoundCallback(&UlTxPduCallback, arg));
409 Config::Connect(basePath +
"/DataRadioBearerMap/*/NrRlc/RxPDU",
410 MakeBoundCallback(&DlRxPduCallback, arg));
411 Config::Connect(basePath +
"/Srb1/NrRlc/TxPDU", MakeBoundCallback(&UlTxPduCallback, arg));
412 Config::Connect(basePath +
"/Srb1/NrRlc/RxPDU", MakeBoundCallback(&DlRxPduCallback, arg));
416 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
418 arg->cellId = cellId;
419 arg->stats = m_pdcpStats;
420 Config::Connect(basePath +
"/DataRadioBearerMap/*/NrPdcp/RxPDU",
421 MakeBoundCallback(&DlRxPduCallback, arg));
422 Config::Connect(basePath +
"/DataRadioBearerMap/*/NrPdcp/TxPDU",
423 MakeBoundCallback(&UlTxPduCallback, arg));
424 Config::Connect(basePath +
"/Srb1/NrPdcp/RxPDU", MakeBoundCallback(&DlRxPduCallback, arg));
425 Config::Connect(basePath +
"/Srb1/NrPdcp/TxPDU", MakeBoundCallback(&UlTxPduCallback, arg));
430NrBearerStatsConnector::ConnectTracesGnb(std::string context,
435 NS_LOG_FUNCTION(
this << context);
436 NS_LOG_LOGIC(
this <<
"expected context should match /NodeList/*/DeviceList/*/NrGnbRrc/");
437 std::ostringstream basePath;
438 basePath << context.substr(0, context.rfind(
'/')) <<
"/UeMap/" << (uint32_t)rnti;
441 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
443 arg->cellId = cellId;
444 arg->stats = m_rlcStats;
445 Config::Connect(basePath.str() +
"/DataRadioBearerMap/*/NrRlc/RxPDU",
446 MakeBoundCallback(&UlRxPduCallback, arg));
447 Config::Connect(basePath.str() +
"/DataRadioBearerMap/*/NrRlc/TxPDU",
448 MakeBoundCallback(&DlTxPduCallback, arg));
449 Config::Connect(basePath.str() +
"/Srb0/NrRlc/RxPDU",
450 MakeBoundCallback(&UlRxPduCallback, arg));
451 Config::Connect(basePath.str() +
"/Srb0/NrRlc/TxPDU",
452 MakeBoundCallback(&DlTxPduCallback, arg));
453 Config::Connect(basePath.str() +
"/Srb1/NrRlc/RxPDU",
454 MakeBoundCallback(&UlRxPduCallback, arg));
455 Config::Connect(basePath.str() +
"/Srb1/NrRlc/TxPDU",
456 MakeBoundCallback(&DlTxPduCallback, arg));
460 Ptr<NrBoundCallbackArgument> arg = Create<NrBoundCallbackArgument>();
462 arg->cellId = cellId;
463 arg->stats = m_pdcpStats;
464 Config::Connect(basePath.str() +
"/DataRadioBearerMap/*/NrPdcp/TxPDU",
465 MakeBoundCallback(&DlTxPduCallback, arg));
466 Config::Connect(basePath.str() +
"/DataRadioBearerMap/*/NrPdcp/RxPDU",
467 MakeBoundCallback(&UlRxPduCallback, arg));
468 Config::Connect(basePath.str() +
"/Srb1/NrPdcp/TxPDU",
469 MakeBoundCallback(&DlTxPduCallback, arg));
470 Config::Connect(basePath.str() +
"/Srb1/NrPdcp/RxPDU",
471 MakeBoundCallback(&UlRxPduCallback, arg));
476NrBearerStatsConnector::DisconnectTracesUe(std::string context,
481 NS_LOG_FUNCTION(
this);
485NrBearerStatsConnector::DisconnectTracesGnb(std::string context,
490 NS_LOG_FUNCTION(
this);
493Ptr<NrBearerStatsBase>
499Ptr<NrBearerStatsBase>
static void NotifyHandoverStartGnb(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
static void NotifyConnectionSetupUe(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
static void NotifyRandomAccessSuccessfulUe(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
NrBearerStatsConnector()
Constructor.
Ptr< NrBearerStatsBase > GetPdcpStats()
static void NotifyHandoverEndOkUe(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
static void NotifyNewUeContextGnb(NrBearerStatsConnector *c, std::string context, uint16_t cellid, uint16_t rnti)
void EnablePdcpStats(Ptr< NrBearerStatsBase > pdcpStats)
static void NotifyHandoverStartUe(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
void EnableRlcStats(Ptr< NrBearerStatsBase > rlcStats)
Ptr< NrBearerStatsBase > GetRlcStats()
static void NotifyConnectionReconfigurationGnb(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
static void NotifyConnectionReconfigurationUe(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
static void NotifyHandoverEndOkGnb(NrBearerStatsConnector *c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)