lte: Update RadioBearerStats connector and eNB/UE RRC

see merge request nsnam/ns-3-dev!64 and issue nsnam/ns-3-dev!54
This commit is contained in:
Manuel Requena
2019-05-10 11:10:29 +02:00
committed by ZorazeAli
parent f7f0fe435e
commit ed411fa9c0
6 changed files with 305 additions and 401 deletions

View File

@@ -1,6 +1,6 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
* Copyright (c) 2012-2018 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -15,19 +15,13 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Nicola Baldo <nbaldo@cttc.es>
* Authors: Nicola Baldo <nbaldo@cttc.es>
* Manuel Requena <manuel.requena@cttc.es>
*/
#include <ns3/log.h>
#include "radio-bearer-stats-connector.h"
#include "ns3/log.h"
#include "radio-bearer-stats-calculator.h"
#include <ns3/lte-enb-rrc.h>
#include <ns3/lte-enb-net-device.h>
#include <ns3/lte-ue-rrc.h>
#include <ns3/lte-ue-net-device.h>
#include "radio-bearer-stats-connector.h"
namespace ns3 {
@@ -102,7 +96,6 @@ UlTxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
uint16_t rnti, uint8_t lcid, uint32_t packetSize)
{
NS_LOG_FUNCTION (path << rnti << (uint16_t)lcid << packetSize);
arg->stats->UlTxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize);
}
@@ -120,155 +113,121 @@ UlRxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
{
NS_LOG_FUNCTION (path << rnti << (uint16_t)lcid << packetSize << delay);
arg->stats->UlRxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize, delay);
}
RadioBearerStatsConnector::RadioBearerStatsConnector ()
: m_connected (false)
{
}
void
void
RadioBearerStatsConnector::EnableRlcStats (Ptr<RadioBearerStatsCalculator> rlcStats)
{
m_rlcStats = rlcStats;
EnsureConnected ();
}
void
void
RadioBearerStatsConnector::EnablePdcpStats (Ptr<RadioBearerStatsCalculator> pdcpStats)
{
m_pdcpStats = pdcpStats;
EnsureConnected ();
}
void
void
RadioBearerStatsConnector::EnsureConnected ()
{
NS_LOG_FUNCTION (this);
if (!m_connected)
{
Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/NewUeContext",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyNewUeContextEnb, this));
MakeBoundCallback (&RadioBearerStatsConnector::NotifyNewUeContextEnb, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/RandomAccessSuccessful",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyRandomAccessSuccessfulUe, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/ConnectionReconfiguration",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyConnectionReconfigurationEnb, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionReconfiguration",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyConnectionReconfigurationUe, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverStart",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverStartEnb, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverStart",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverStartUe, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverEndOk",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverEndOkEnb, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk",
MakeBoundCallback (&RadioBearerStatsConnector::NotifyHandoverEndOkUe, this));
MakeBoundCallback (&RadioBearerStatsConnector::NotifyRandomAccessSuccessfulUe, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/Srb1Created",
MakeBoundCallback (&RadioBearerStatsConnector::CreatedSrb1Ue, this));
Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/DrbCreated",
MakeBoundCallback (&RadioBearerStatsConnector::CreatedDrbUe, this));
m_connected = true;
}
}
void
RadioBearerStatsConnector::NotifyRandomAccessSuccessfulUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
c->ConnectSrb0Traces (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyConnectionSetupUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
c->ConnectSrb1TracesUe (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyConnectionReconfigurationUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
c->ConnectTracesUeIfFirstTime (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyHandoverStartUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint16_t targetCellId)
{
c->DisconnectTracesUe (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyHandoverEndOkUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
c->ConnectTracesUe (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyNewUeContextEnb (RadioBearerStatsConnector* c, std::string context, uint16_t cellId, uint16_t rnti)
{
c->StoreUeManagerPath (context, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyConnectionReconfigurationEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
c->ConnectTracesEnbIfFirstTime (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyHandoverStartEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint16_t targetCellId)
{
c->DisconnectTracesEnb (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyHandoverEndOkEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
c->ConnectTracesEnb (context, imsi, cellId, rnti);
}
void
void
RadioBearerStatsConnector::StoreUeManagerPath (std::string context, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << context << cellId << rnti);
std::ostringstream ueManagerPath;
ueManagerPath << context.substr (0, context.rfind ("/")) << "/UeMap/" << (uint32_t) rnti;
std::string ueManagerPath;
ueManagerPath = context.substr (0, context.rfind ("/")) + "/UeMap/" + std::to_string (rnti);
NS_LOG_DEBUG ("ueManagerPath = " << ueManagerPath);
CellIdRnti key;
key.cellId = cellId;
key.rnti = rnti;
m_ueManagerPathByCellIdRnti[key] = ueManagerPath.str ();
m_ueManagerPathByCellIdRnti[key] = ueManagerPath;
Config::Connect (ueManagerPath + "/DrbCreated",
MakeBoundCallback (&RadioBearerStatsConnector::CreatedDrbEnb, this));
}
void
RadioBearerStatsConnector::ConnectSrb0Traces (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
void
RadioBearerStatsConnector::NotifyNewUeContextEnb (RadioBearerStatsConnector* c, std::string context, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << imsi << cellId << rnti);
std::string ueRrcPath = context.substr (0, context.rfind ("/"));
NS_LOG_FUNCTION (c << context << cellId << rnti);
c->StoreUeManagerPath (context, cellId, rnti);
}
void
RadioBearerStatsConnector::NotifyRandomAccessSuccessfulUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (c << context << imsi << cellId << rnti);
c->ConnectTracesSrb0 (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::CreatedDrbEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t lcid)
{
NS_LOG_FUNCTION (c << context << imsi << cellId << rnti << (uint16_t)lcid);
c->ConnectTracesDrbEnb (context, imsi, cellId, rnti, lcid);
}
void
RadioBearerStatsConnector::CreatedSrb1Ue (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (c << context << imsi << cellId << rnti);
c->ConnectTracesSrb1 (context, imsi, cellId, rnti);
}
void
RadioBearerStatsConnector::CreatedDrbUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t lcid)
{
NS_LOG_FUNCTION (c << context << imsi << cellId << rnti << (uint16_t)lcid);
c->ConnectTracesDrbUe (context, imsi, cellId, rnti, lcid);
}
void
RadioBearerStatsConnector::ConnectTracesSrb0 (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << context << imsi << cellId << rnti);
std::string ueRrcPath = context.substr (0, context.rfind ("/"));
NS_LOG_LOGIC ("ueRrcPath = " << ueRrcPath);
CellIdRnti key;
key.cellId = cellId;
key.rnti = rnti;
std::map<CellIdRnti, std::string>::iterator it = m_ueManagerPathByCellIdRnti.find (key);
NS_ASSERT (it != m_ueManagerPathByCellIdRnti.end ());
std::string ueManagerPath = it->second;
NS_LOG_LOGIC (this << " ueManagerPath: " << ueManagerPath);
m_ueManagerPathByCellIdRnti.erase (it);
std::string ueManagerPath = it->second;
NS_LOG_LOGIC ("ueManagerPath = " << ueManagerPath);
if (m_rlcStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->cellId = cellId;
arg->stats = m_rlcStats;
// diconnect eventually previously connected SRB0 both at UE and eNB
Config::Disconnect (ueRrcPath + "/Srb0/LteRlc/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Disconnect (ueRrcPath + "/Srb0/LteRlc/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
Config::Disconnect (ueManagerPath + "/Srb0/LteRlc/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Disconnect (ueManagerPath + "/Srb0/LteRlc/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
// connect SRB0 both at UE and eNB
Config::Connect (ueRrcPath + "/Srb0/LteRlc/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (ueRrcPath + "/Srb0/LteRlc/RxPDU",
@@ -277,8 +236,32 @@ RadioBearerStatsConnector::ConnectSrb0Traces (std::string context, uint64_t imsi
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (ueManagerPath + "/Srb0/LteRlc/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
}
}
// connect SRB1 at eNB only (at UE SRB1 will be setup later)
void
RadioBearerStatsConnector::ConnectTracesSrb1 (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << context << imsi << cellId << rnti);
std::string ueRrcPath = context.substr (0, context.rfind ("/"));
NS_LOG_LOGIC ("ueRrcPath = " << ueRrcPath);
CellIdRnti key;
key.cellId = cellId;
key.rnti = rnti;
std::map<CellIdRnti, std::string>::iterator it = m_ueManagerPathByCellIdRnti.find (key);
NS_ASSERT (it != m_ueManagerPathByCellIdRnti.end ());
std::string ueManagerPath = it->second;
NS_LOG_LOGIC ("ueManagerPath = " << ueManagerPath);
if (m_rlcStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->stats = m_rlcStats;
Config::Connect (ueRrcPath + "/Srb1/LteRlc/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (ueRrcPath + "/Srb1/LteRlc/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
Config::Connect (ueManagerPath + "/Srb1/LteRlc/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (ueManagerPath + "/Srb1/LteRlc/RxPDU",
@@ -288,162 +271,111 @@ RadioBearerStatsConnector::ConnectSrb0Traces (std::string context, uint64_t imsi
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->cellId = cellId;
arg->stats = m_pdcpStats;
// connect SRB1 at eNB only (at UE SRB1 will be setup later)
Config::Connect (ueManagerPath + "/Srb1/LtePdcp/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
Config::Connect (ueRrcPath + "/Srb1/LtePdcp/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (ueRrcPath + "/Srb1/LtePdcp/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
Config::Connect (ueManagerPath + "/Srb1/LtePdcp/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (ueManagerPath + "/Srb1/LtePdcp/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
}
}
void
RadioBearerStatsConnector::ConnectSrb1TracesUe (std::string ueRrcPath, uint64_t imsi, uint16_t cellId, uint16_t rnti)
void
RadioBearerStatsConnector::ConnectTracesDrbEnb (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t lcid)
{
NS_LOG_FUNCTION (this << imsi << cellId << rnti);
if (m_rlcStats)
NS_LOG_FUNCTION (this << context << imsi << cellId << rnti << (uint16_t)lcid);
NS_LOG_LOGIC ("expected context should match /NodeList/*/DeviceList/*/LteEnbRrc/");
std::string basePath;
basePath = context.substr (0, context.rfind ("/")) + "/DataRadioBearerMap/" + std::to_string (lcid - 2);
NS_LOG_LOGIC ("basePath = " << basePath);
if (m_rlcStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->cellId = cellId;
arg->stats = m_rlcStats;
Config::Connect (ueRrcPath + "/Srb1/LteRlc/TxPDU",
Config::Connect (basePath + "/LteRlc/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (basePath + "/LteRlc/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
}
if (m_pdcpStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->stats = m_pdcpStats;
Config::Connect (basePath + "/LtePdcp/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (basePath + "/LtePdcp/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
}
}
void
RadioBearerStatsConnector::ConnectTracesDrbUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t lcid)
{
NS_LOG_FUNCTION (this << context << imsi << cellId << rnti << (uint16_t)lcid);
NS_LOG_LOGIC ("expected context should match /NodeList/*/DeviceList/*/LteUeRrc/");
std::string basePath;
basePath = context.substr (0, context.rfind ("/")) + "/DataRadioBearerMap/" + std::to_string (lcid);
NS_LOG_LOGIC ("basePath = " << basePath);
if (m_rlcStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->stats = m_rlcStats;
Config::Connect (basePath + "/LteRlc/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (ueRrcPath + "/Srb1/LteRlc/RxPDU",
Config::Connect (basePath + "/LteRlc/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
}
if (m_pdcpStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->cellId = cellId;
arg->stats = m_pdcpStats;
Config::Connect (ueRrcPath + "/Srb1/LtePdcp/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
Config::Connect (ueRrcPath + "/Srb1/LtePdcp/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
}
}
void
RadioBearerStatsConnector::ConnectTracesUeIfFirstTime (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << context);
if (m_imsiSeenUe.find (imsi) == m_imsiSeenUe.end ())
{
m_imsiSeenUe.insert (imsi);
ConnectTracesUe (context, imsi, cellId, rnti);
}
}
void
RadioBearerStatsConnector::ConnectTracesEnbIfFirstTime (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << context);
if (m_imsiSeenEnb.find (imsi) == m_imsiSeenEnb.end ())
{
m_imsiSeenEnb.insert (imsi);
ConnectTracesEnb (context, imsi, cellId, rnti);
Config::Connect (basePath + "/LtePdcp/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (basePath + "/LtePdcp/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
}
}
void
RadioBearerStatsConnector::ConnectTracesUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << context);
NS_LOG_LOGIC (this << "expected context should match /NodeList/*/DeviceList/*/LteUeRrc/");
std::string basePath = context.substr (0, context.rfind ("/"));
if (m_rlcStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->stats = m_rlcStats;
Config::Connect (basePath + "/DataRadioBearerMap/*/LteRlc/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (basePath + "/DataRadioBearerMap/*/LteRlc/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
Config::Connect (basePath + "/Srb1/LteRlc/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (basePath + "/Srb1/LteRlc/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
}
if (m_pdcpStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->stats = m_pdcpStats;
Config::Connect (basePath + "/DataRadioBearerMap/*/LtePdcp/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
Config::Connect (basePath + "/DataRadioBearerMap/*/LtePdcp/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
Config::Connect (basePath + "/Srb1/LtePdcp/RxPDU",
MakeBoundCallback (&DlRxPduCallback, arg));
Config::Connect (basePath + "/Srb1/LtePdcp/TxPDU",
MakeBoundCallback (&UlTxPduCallback, arg));
}
}
void
RadioBearerStatsConnector::ConnectTracesEnb (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this << context);
NS_LOG_LOGIC (this << "expected context should match /NodeList/*/DeviceList/*/LteEnbRrc/");
std::ostringstream basePath;
basePath << context.substr (0, context.rfind ("/")) << "/UeMap/" << (uint32_t) rnti;
if (m_rlcStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->stats = m_rlcStats;
Config::Connect (basePath.str () + "/DataRadioBearerMap/*/LteRlc/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
Config::Connect (basePath.str () + "/DataRadioBearerMap/*/LteRlc/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (basePath.str () + "/Srb0/LteRlc/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
Config::Connect (basePath.str () + "/Srb0/LteRlc/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (basePath.str () + "/Srb1/LteRlc/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
Config::Connect (basePath.str () + "/Srb1/LteRlc/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
}
if (m_pdcpStats)
{
Ptr<BoundCallbackArgument> arg = Create<BoundCallbackArgument> ();
arg->imsi = imsi;
arg->cellId = cellId;
arg->stats = m_pdcpStats;
Config::Connect (basePath.str () + "/DataRadioBearerMap/*/LtePdcp/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (basePath.str () + "/DataRadioBearerMap/*/LtePdcp/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
Config::Connect (basePath.str () + "/Srb1/LtePdcp/TxPDU",
MakeBoundCallback (&DlTxPduCallback, arg));
Config::Connect (basePath.str () + "/Srb1/LtePdcp/RxPDU",
MakeBoundCallback (&UlRxPduCallback, arg));
}
}
void
RadioBearerStatsConnector::DisconnectTracesUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this);
}
void
void
RadioBearerStatsConnector::DisconnectTracesEnb (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this);
/**
* This method is left empty to be extended in future.
* Note: Be aware, that each of the connect method uses
* its own BoundCallbackArgument struct as an argument
* of the callback. And, if the code to disconnect the
* traces would also use their own struct, the traces
* will not disconnect, since it changes the parameter
* of the callback.
*/
}
void
RadioBearerStatsConnector::DisconnectTracesUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
{
NS_LOG_FUNCTION (this);
/**
* This method is left empty to be extended in future.
* Note: Be aware, that each of the connect method uses
* its own BoundCallbackArgument struct as an argument
* of the callback. And, if the code to disconnect the
* traces would also use their own struct, the traces
* will not disconnect, since it changes the parameter
* of the callback.
*/
}
} // namespace ns3

View File

@@ -1,6 +1,6 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
* Copyright (c) 2012-2018 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -15,21 +15,18 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Nicola Baldo <nbaldo@cttc.es>
* Authors: Nicola Baldo <nbaldo@cttc.es>
* Manuel Requena <manuel.requena@cttc.es>
*/
#ifndef RADIO_BEARER_STATS_CONNECTOR_H
#define RADIO_BEARER_STATS_CONNECTOR_H
#include "ns3/ptr.h"
#include "ns3/simple-ref-count.h"
#include "ns3/config.h"
#include "ns3/traced-callback.h"
#include <ns3/traced-callback.h>
#include <ns3/config.h>
#include <ns3/simple-ref-count.h>
#include <ns3/ptr.h>
#include <set>
#include <map>
namespace ns3 {
@@ -74,9 +71,22 @@ public:
// trace sinks, to be used with MakeBoundCallback
/**
* Function hooked to NewUeContext trace source at eNB RRC,
* which is fired upon creation of a new UE context.
* It stores the UE manager path and connects the callback that will be called
* when the DRB is created in the eNB.
* \param c
* \param context
* \param cellid
* \param rnti
*/
static void NotifyNewUeContextEnb (RadioBearerStatsConnector* c, std::string context, uint16_t cellid, uint16_t rnti);
/**
* Function hooked to RandomAccessSuccessful trace source at UE RRC,
* which is fired upon successful completion of the random access procedure
* which is fired upon successful completion of the random access procedure.
* It connects the callbacks for the SRB0 at the eNB and the UE.
* \param c
* \param context
* \param imsi
@@ -86,168 +96,42 @@ public:
static void NotifyRandomAccessSuccessfulUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Sink connected source of UE Connection Setup trace. Not used.
* Function hooked to Srb1Created trace source at UE RRC,
* which is fired when SRB1 is created, i.e. RLC and PDCP are created for one LC = 1.
* It connects the callbacks for the DRB at the eNB.
* \param c
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
static void NotifyConnectionSetupUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
static void CreatedSrb1Ue (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Function hooked to ConnectionReconfiguration trace source at UE RRC,
* which is fired upon RRC connection reconfiguration
* Function hooked to DrbCreated trace source at UE manager in eNB RRC,
* which is fired when DRB is created, i.e. RLC and PDCP are created for LC = lcid.
* It connects the callbacks for the DRB at the eNB.
* \param c
* \param context
* \param imsi
* \param cellid
* \param rnti
* \param lcid
*/
static void NotifyConnectionReconfigurationUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
static void CreatedDrbEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint8_t lcid);
/**
* Function hooked to HandoverStart trace source at UE RRC,
* which is fired upon start of a handover procedure
* Function hooked to DrbCreated trace source at UE RRC,
* which is fired when DRB is created, i.e. RLC and PDCP are created for LC = lcid.
* It connects the callbacks for the DRB at the UE.
* \param c
* \param context
* \param imsi
* \param cellid
* \param rnti
* \param targetCellId
* \param lcid
*/
static void NotifyHandoverStartUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId);
/**
* Function hooked to HandoverStart trace source at UE RRC,
* which is fired upon successful termination of a handover procedure
* \param c
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
static void NotifyHandoverEndOkUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Function hooked to NewUeContext trace source at eNB RRC,
* which is fired upon creation of a new UE context
* \param c
* \param context
* \param cellid
* \param rnti
*/
static void NotifyNewUeContextEnb (RadioBearerStatsConnector* c, std::string context, uint16_t cellid, uint16_t rnti);
/**
* Function hooked to ConnectionReconfiguration trace source at eNB RRC,
* which is fired upon RRC connection reconfiguration
* \param c
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
static void NotifyConnectionReconfigurationEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Function hooked to HandoverStart trace source at eNB RRC,
* which is fired upon start of a handover procedure
* \param c
* \param context
* \param imsi
* \param cellid
* \param rnti
* \param targetCellId
*/
static void NotifyHandoverStartEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId);
/**
* Function hooked to HandoverEndOk trace source at eNB RRC,
* which is fired upon successful termination of a handover procedure
* \param c
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
static void NotifyHandoverEndOkEnb (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
private:
/**
* Creates UE Manager path and stores it in m_ueManagerPathByCellIdRnti
* \param ueManagerPath
* \param cellId
* \param rnti
*/
void StoreUeManagerPath (std::string ueManagerPath, uint16_t cellId, uint16_t rnti);
/**
* Connects Srb0 trace sources at UE and eNB to RLC and PDCP calculators,
* and Srb1 trace sources at eNB to RLC and PDCP calculators,
* \param ueRrcPath
* \param imsi
* \param cellId
* \param rnti
*/
void ConnectSrb0Traces (std::string ueRrcPath, uint64_t imsi, uint16_t cellId, uint16_t rnti);
/**
* Connects Srb1 trace sources at UE to RLC and PDCP calculators
* \param ueRrcPath
* \param imsi
* \param cellId
* \param rnti
*/
void ConnectSrb1TracesUe (std::string ueRrcPath, uint64_t imsi, uint16_t cellId, uint16_t rnti);
/**
* Connects all trace sources at UE to RLC and PDCP calculators.
* This function can connect traces only once for UE.
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
void ConnectTracesUeIfFirstTime (std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Connects all trace sources at eNB to RLC and PDCP calculators.
* This function can connect traces only once for eNB.
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
void ConnectTracesEnbIfFirstTime (std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Connects all trace sources at UE to RLC and PDCP calculators.
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
void ConnectTracesUe (std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Disconnects all trace sources at UE to RLC and PDCP calculators.
* Function is not implemented.
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
void DisconnectTracesUe (std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Connects all trace sources at eNB to RLC and PDCP calculators
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
void ConnectTracesEnb (std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
static void CreatedDrbUe (RadioBearerStatsConnector* c, std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint8_t lcid);
/**
* Disconnects all trace sources at eNB to RLC and PDCP calculators.
@@ -259,14 +143,69 @@ private:
*/
void DisconnectTracesEnb (std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
/**
* Disconnects all trace sources at UE to RLC and PDCP calculators.
* Function is not implemented.
* \param context
* \param imsi
* \param cellid
* \param rnti
*/
void DisconnectTracesUe (std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti);
private:
/**
* Creates UE Manager path and stores it in m_ueManagerPathByCellIdRnti
* \param ueManagerPath
* \param cellId
* \param rnti
*/
void StoreUeManagerPath (std::string ueManagerPath, uint16_t cellId, uint16_t rnti);
/**
* Connects SRB0 trace sources at UE and eNB to RLC and PDCP calculators
* \param context
* \param imsi
* \param cellId
* \param rnti
*/
void ConnectTracesSrb0 (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti);
/**
* Connects SRB1 trace sources at UE and eNB to RLC and PDCP calculators
* \param context
* \param imsi
* \param cellId
* \param rnti
*/
void ConnectTracesSrb1 (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti);
/**
* Connects DRB trace sources at eNB to RLC and PDCP calculators
* \param context
* \param imsi
* \param cellId
* \param rnti
* \param lcid
*/
void ConnectTracesDrbEnb (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t lcid);
/**
* Connects DRB trace sources at UE to RLC and PDCP calculators
* \param context
* \param imsi
* \param cellId
* \param rnti
* \param lcid
*/
void ConnectTracesDrbUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t lcid);
Ptr<RadioBearerStatsCalculator> m_rlcStats; //!< Calculator for RLC Statistics
Ptr<RadioBearerStatsCalculator> m_pdcpStats; //!< Calculator for PDCP Statistics
bool m_connected; //!< true if traces are connected to sinks, initially set to false
std::set<uint64_t> m_imsiSeenUe; //!< stores all UEs for which RLC and PDCP traces were connected
std::set<uint64_t> m_imsiSeenEnb; //!< stores all eNBs for which RLC and PDCP traces were connected
/**
* Struct used as key in m_ueManagerPathByCellIdRnti map
*/
@@ -292,9 +231,6 @@ private:
};
} // namespace ns3
#endif // RADIO_BEARER_STATS_CONNECTOR_H

View File

@@ -346,6 +346,10 @@ TypeId UeManager::GetTypeId (void)
"UeManager at the eNB RRC",
MakeTraceSourceAccessor (&UeManager::m_stateTransitionTrace),
"ns3::UeManager::StateTracedCallback")
.AddTraceSource ("DrbCreated",
"trace fired after DRB is created",
MakeTraceSourceAccessor (&UeManager::m_drbCreatedTrace),
"ns3::UeManager::ImsiCidRntiLcIdTracedCallback")
;
return tid;
}
@@ -431,6 +435,8 @@ UeManager::SetupDataRadioBearer (EpsBearer bearer, uint8_t bearerId, uint32_t gt
drbInfo->m_pdcp = pdcp;
}
m_drbCreatedTrace (m_imsi, m_rrc->ComponentCarrierToCellId (m_componentCarrierId), m_rnti, lcid);
std::vector<LteCcmRrcSapProvider::LcsConfig> lcOnCcMapping = m_rrc->m_ccmRrcSapProvider->SetupDataRadioBearer (bearer, bearerId, m_rnti, lcid, m_rrc->GetLogicalChannelGroup (bearer), rlc->GetLteMacSapUser ());
// LteEnbCmacSapProvider::LcInfo lcinfo;
// lcinfo.rnti = m_rnti;

View File

@@ -542,6 +542,13 @@ private:
*/
TracedCallback<uint64_t, uint16_t, uint16_t, State, State> m_stateTransitionTrace;
/**
* The `DrbCreated` trace source. Fired when DRB is created, i.e.
* the RLC and PDCP entities are created for one logical channel.
* Exporting IMSI, cell ID, RNTI, and LCID
*/
TracedCallback<uint64_t, uint16_t, uint16_t, uint8_t> m_drbCreatedTrace;
uint16_t m_sourceX2apId; ///< source X2 ap ID
uint16_t m_sourceCellId; ///< source cell ID
uint16_t m_targetCellId; ///< target cell ID

View File

@@ -281,6 +281,14 @@ LteUeRrc::GetTypeId (void)
"trace fired after configuring secondary carriers",
MakeTraceSourceAccessor (&LteUeRrc::m_sCarrierConfiguredTrace),
"ns3::LteUeRrc::SCarrierConfiguredTracedCallback")
.AddTraceSource ("Srb1Created",
"trace fired after SRB1 is created",
MakeTraceSourceAccessor (&LteUeRrc::m_srb1CreatedTrace),
"ns3::LteUeRrc::ImsiCidRntiTracedCallback")
.AddTraceSource ("DrbCreated",
"trace fired after DRB is created",
MakeTraceSourceAccessor (&LteUeRrc::m_drbCreatedTrace),
"ns3::LteUeRrc::ImsiCidRntiLcIdTracedCallback")
;
return tid;
}
@@ -1339,7 +1347,8 @@ LteUeRrc::ApplyRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedic
m_srb1->m_rlc = rlc;
m_srb1->m_pdcp = pdcp;
m_srb1->m_srbIdentity = 1;
m_srb1CreatedTrace (m_imsi, m_cellId, m_rnti);
m_srb1->m_logicalChannelConfig.priority = stamIt->logicalChannelConfig.priority;
m_srb1->m_logicalChannelConfig.prioritizedBitRateKbps = stamIt->logicalChannelConfig.prioritizedBitRateKbps;
m_srb1->m_logicalChannelConfig.bucketSizeDurationMs = stamIt->logicalChannelConfig.bucketSizeDurationMs;
@@ -1433,7 +1442,9 @@ LteUeRrc::ApplyRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedic
m_bid2DrbidMap[dtamIt->epsBearerIdentity] = dtamIt->drbIdentity;
m_drbMap.insert (std::pair<uint8_t, Ptr<LteDataRadioBearerInfo> > (dtamIt->drbIdentity, drbInfo));
m_drbCreatedTrace (m_imsi, m_cellId, m_rnti, dtamIt->drbIdentity);
struct LteUeCmacSapProvider::LogicalChannelConfig lcConfig;
lcConfig.priority = dtamIt->logicalChannelConfig.priority;

View File

@@ -858,6 +858,18 @@ private:
* message.
*/
TracedCallback<Ptr<LteUeRrc>, std::list<LteRrcSap::SCellToAddMod> > m_sCarrierConfiguredTrace;
/**
* The `Srb1Created` trace source. Fired when SRB1 is created, i.e.
* the RLC and PDCP entities are created for logical channel = 1.
* Exporting IMSI, cell ID, and RNTI
*/
TracedCallback<uint64_t, uint16_t, uint16_t> m_srb1CreatedTrace;
/**
* The `DrbCreated` trace source. Fired when DRB is created, i.e.
* the RLC and PDCP entities are created for one logical channel.
* Exporting IMSI, cell ID, RNTI, and LCID
*/
TracedCallback<uint64_t, uint16_t, uint16_t, uint8_t> m_drbCreatedTrace;
/// True if a connection request by upper layers is pending.
bool m_connectionPending;