22 #include "radio-bearer-stats-calculator.h" 
   23 #include "ns3/string.h" 
   24 #include "ns3/nstime.h" 
   34 NS_OBJECT_ENSURE_REGISTERED ( RadioBearerStatsCalculator);
 
   37   : m_firstWrite (true),
 
   38     m_pendingOutput (false), 
 
   39     m_protocolType (
"RLC")
 
   45   : m_firstWrite (true),
 
   46     m_pendingOutput (false)
 
   49   m_protocolType = protocolType;
 
   61     TypeId (
"ns3::RadioBearerStatsCalculator")
 
   63     .AddAttribute (
"StartTime", 
"Start time of the on going epoch.", 
 
   68     .AddAttribute (
"EpochDuration", 
"Epoch duration.", 
 
   73     .AddAttribute (
"DlRlcOutputFilename",
 
   74                    "Name of the file where the downlink results will be saved.",
 
   78     .AddAttribute (
"UlRlcOutputFilename",
 
   79                    "Name of the file where the uplink results will be saved.",
 
   83     .AddAttribute (
"DlPdcpOutputFilename",
 
   84                    "Name of the file where the downlink results will be saved.",
 
   88     .AddAttribute (
"UlPdcpOutputFilename",
 
   89                    "Name of the file where the uplink results will be saved.",
 
  111   RescheduleEndEpoch ();
 
  124   RescheduleEndEpoch ();
 
  136   NS_LOG_FUNCTION (
this << 
"UlTxPDU" << cellId << imsi << rnti << (uint32_t) lcid << packetSize);
 
  140       m_ulCellId[p] = cellId;
 
  143       m_ulTxData[p] += packetSize;
 
  151   NS_LOG_FUNCTION (
this << 
"DlTxPDU" << cellId << imsi << rnti << (uint32_t) lcid << packetSize);
 
  155       m_dlCellId[p] = cellId;
 
  158       m_dlTxData[p] += packetSize;
 
  167   NS_LOG_FUNCTION (
this << 
"UlRxPDU" << cellId << imsi << rnti << (uint32_t) lcid << packetSize << delay);
 
  171       m_ulCellId[p] = cellId;
 
  173       m_ulRxData[p] += packetSize;
 
  175       Uint64StatsMap::iterator it = m_ulDelay.find (p);
 
  176       if (it == m_ulDelay.end ())
 
  178           NS_LOG_DEBUG (
this << 
" Creating UL stats calculators for IMSI " << p.m_imsi << 
" and LCID " << (uint32_t) p.m_lcId);
 
  179           m_ulDelay[p] = CreateObject<MinMaxAvgTotalCalculator<uint64_t> > ();
 
  180           m_ulPduSize[p] = CreateObject<MinMaxAvgTotalCalculator<uint32_t> > ();
 
  182       m_ulDelay[p]->Update (delay);
 
  183       m_ulPduSize[p]->Update (packetSize);
 
  191   NS_LOG_FUNCTION (
this << 
"DlRxPDU" << cellId << imsi << rnti << (uint32_t) lcid << packetSize << delay);
 
  195       m_dlCellId[p] = cellId;
 
  197       m_dlRxData[p] += packetSize;
 
  199       Uint64StatsMap::iterator it = m_dlDelay.find (p);
 
  200       if (it == m_dlDelay.end ())
 
  202           NS_LOG_DEBUG (
this << 
" Creating DL stats calculators for IMSI " << p.m_imsi << 
" and LCID " << (uint32_t) p.m_lcId);
 
  203           m_dlDelay[p] = CreateObject<MinMaxAvgTotalCalculator<uint64_t> > ();
 
  204           m_dlPduSize[p] = CreateObject<MinMaxAvgTotalCalculator<uint32_t> > ();
 
  206       m_dlDelay[p]->Update (delay);
 
  207       m_dlPduSize[p]->Update (packetSize);
 
  213 RadioBearerStatsCalculator::ShowResults (
void)
 
  219   std::ofstream ulOutFile;
 
  220   std::ofstream dlOutFile;
 
  225       if (!ulOutFile.is_open ())
 
  232       if (!dlOutFile.is_open ())
 
  238       ulOutFile << 
"% start\tend\tCellId\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
 
  239       ulOutFile << 
"delay\tstdDev\tmin\tmax\t";
 
  240       ulOutFile << 
"PduSize\tstdDev\tmin\tmax";
 
  241       ulOutFile << std::endl;
 
  242       dlOutFile << 
"% start\tend\tCellId\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
 
  243       dlOutFile << 
"delay\tstdDev\tmin\tmax\t";
 
  244       dlOutFile << 
"PduSize\tstdDev\tmin\tmax";
 
  245       dlOutFile << std::endl;
 
  250       if (!ulOutFile.is_open ())
 
  257       if (!dlOutFile.is_open ())
 
  264   WriteUlResults (ulOutFile);
 
  265   WriteDlResults (dlOutFile);
 
  271 RadioBearerStatsCalculator::WriteUlResults (std::ofstream& outFile)
 
  277   std::vector < ImsiLcidPair_t > pairVector;
 
  278   for (Uint32Map::iterator it = m_ulTxPackets.begin (); it != m_ulTxPackets.end (); ++it)
 
  280       if (find (pairVector.begin (), pairVector.end (), (*it).first) == pairVector.end ())
 
  282           pairVector.push_back ((*it).first);
 
  287   for (std::vector<ImsiLcidPair_t>::iterator it = pairVector.begin (); it != pairVector.end (); ++it)
 
  289       ImsiLcidPair_t p = *it;
 
  291       outFile << endTime.GetNanoSeconds () / 1.0e9 << 
"\t";
 
  292       outFile << 
GetUlCellId (p.m_imsi, p.m_lcId) << 
"\t";
 
  293       outFile << p.m_imsi << 
"\t";
 
  294       outFile << m_flowId[p].m_rnti << 
"\t";
 
  295       outFile << (uint32_t) m_flowId[p].m_lcId << 
"\t";
 
  297       outFile << 
GetUlTxData (p.m_imsi, p.m_lcId) << 
"\t";
 
  299       outFile << 
GetUlRxData (p.m_imsi, p.m_lcId) << 
"\t";
 
  301       for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
 
  303           outFile << (*it) * 1e-9 << 
"\t";
 
  306       for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
 
  308           outFile << (*it) << 
"\t";
 
  310       outFile << std::endl;
 
  317 RadioBearerStatsCalculator::WriteDlResults (std::ofstream& outFile)
 
  322   std::vector < ImsiLcidPair_t > pairVector;
 
  323   for (Uint32Map::iterator it = m_dlTxPackets.begin (); it != m_dlTxPackets.end (); ++it)
 
  325       if (find (pairVector.begin (), pairVector.end (), (*it).first) == pairVector.end ())
 
  327           pairVector.push_back ((*it).first);
 
  332   for (std::vector<ImsiLcidPair_t>::iterator pair = pairVector.begin (); pair != pairVector.end (); ++pair)
 
  334       ImsiLcidPair_t p = *pair;
 
  336       outFile << endTime.GetNanoSeconds () / 1.0e9 << 
"\t";
 
  337       outFile << 
GetDlCellId (p.m_imsi, p.m_lcId) << 
"\t";
 
  338       outFile << p.m_imsi << 
"\t";
 
  339       outFile << m_flowId[p].m_rnti << 
"\t";
 
  340       outFile << (uint32_t) m_flowId[p].m_lcId << 
"\t";
 
  342       outFile << 
GetDlTxData (p.m_imsi, p.m_lcId) << 
"\t";
 
  344       outFile << 
GetDlRxData (p.m_imsi, p.m_lcId) << 
"\t";
 
  346       for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
 
  348           outFile << (*it) * 1e-9 << 
"\t";
 
  351       for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
 
  353           outFile << (*it) << 
"\t";
 
  355       outFile << std::endl;
 
  362 RadioBearerStatsCalculator::ResetResults (
void)
 
  366   m_ulTxPackets.erase (m_ulTxPackets.begin (), m_ulTxPackets.end ());
 
  367   m_ulRxPackets.erase (m_ulRxPackets.begin (), m_ulRxPackets.end ());
 
  368   m_ulRxData.erase (m_ulRxData.begin (), m_ulRxData.end ());
 
  369   m_ulTxData.erase (m_ulTxData.begin (), m_ulTxData.end ());
 
  370   m_ulDelay.erase (m_ulDelay.begin (), m_ulDelay.end ());
 
  371   m_ulPduSize.erase (m_ulPduSize.begin (), m_ulPduSize.end ());
 
  373   m_dlTxPackets.erase (m_dlTxPackets.begin (), m_dlTxPackets.end ());
 
  374   m_dlRxPackets.erase (m_dlRxPackets.begin (), m_dlRxPackets.end ());
 
  375   m_dlRxData.erase (m_dlRxData.begin (), m_dlRxData.end ());
 
  376   m_dlTxData.erase (m_dlTxData.begin (), m_dlTxData.end ());
 
  377   m_dlDelay.erase (m_dlDelay.begin (), m_dlDelay.end ());
 
  378   m_dlPduSize.erase (m_dlPduSize.begin (), m_dlPduSize.end ());
 
  382 RadioBearerStatsCalculator::RescheduleEndEpoch (
void)
 
  385   m_endEpochEvent.
Cancel ();
 
  391 RadioBearerStatsCalculator::EndEpoch (
void)
 
  397   m_endEpochEvent = 
Simulator::Schedule (m_epochDuration, &RadioBearerStatsCalculator::EndEpoch, 
this);
 
  405   return m_ulTxPackets[p];
 
  413   return m_ulRxPackets[p];
 
  421   return m_ulTxData[p];
 
  429   return m_ulRxData[p];
 
  437   Uint64StatsMap::iterator it = m_ulDelay.find (p);
 
  438   if (it == m_ulDelay.end ())
 
  440       NS_LOG_ERROR (
"UL delay for " << imsi << 
" - " << (uint16_t) lcid << 
" not found");
 
  444   return m_ulDelay[p]->getMean ();
 
  452   std::vector<double> stats;
 
  453   Uint64StatsMap::iterator it = m_ulDelay.find (p);
 
  454   if (it == m_ulDelay.end ())
 
  456       stats.push_back (0.0);
 
  457       stats.push_back (0.0);
 
  458       stats.push_back (0.0);
 
  459       stats.push_back (0.0);
 
  463   stats.push_back (m_ulDelay[p]->getMean ());
 
  464   stats.push_back (m_ulDelay[p]->getStddev ());
 
  465   stats.push_back (m_ulDelay[p]->getMin ());
 
  466   stats.push_back (m_ulDelay[p]->getMax ());
 
  475   std::vector<double> stats;
 
  476   Uint32StatsMap::iterator it = m_ulPduSize.find (p);
 
  477   if (it == m_ulPduSize.end ())
 
  479       stats.push_back (0.0);
 
  480       stats.push_back (0.0);
 
  481       stats.push_back (0.0);
 
  482       stats.push_back (0.0);
 
  486   stats.push_back (m_ulPduSize[p]->getMean ());
 
  487   stats.push_back (m_ulPduSize[p]->getStddev ());
 
  488   stats.push_back (m_ulPduSize[p]->getMin ());
 
  489   stats.push_back (m_ulPduSize[p]->getMax ());
 
  498   return m_dlTxPackets[p];
 
  506   return m_dlRxPackets[p];
 
  514   return m_dlTxData[p];
 
  522   return m_dlRxData[p];
 
  530   return m_ulCellId[p];
 
  538   return m_dlCellId[p];
 
  546   Uint64StatsMap::iterator it = m_dlDelay.find (p);
 
  547   if (it == m_dlDelay.end ())
 
  552   return m_dlDelay[p]->getMean ();
 
  560   std::vector<double> stats;
 
  561   Uint64StatsMap::iterator it = m_dlDelay.find (p);
 
  562   if (it == m_dlDelay.end ())
 
  564       stats.push_back (0.0);
 
  565       stats.push_back (0.0);
 
  566       stats.push_back (0.0);
 
  567       stats.push_back (0.0);
 
  571   stats.push_back (m_dlDelay[p]->getMean ());
 
  572   stats.push_back (m_dlDelay[p]->getStddev ());
 
  573   stats.push_back (m_dlDelay[p]->getMin ());
 
  574   stats.push_back (m_dlDelay[p]->getMax ());
 
  583   std::vector<double> stats;
 
  584   Uint32StatsMap::iterator it = m_dlPduSize.find (p);
 
  585   if (it == m_dlPduSize.end ())
 
  587       stats.push_back (0.0);
 
  588       stats.push_back (0.0);
 
  589       stats.push_back (0.0);
 
  590       stats.push_back (0.0);
 
  594   stats.push_back (m_dlPduSize[p]->getMean ());
 
  595   stats.push_back (m_dlPduSize[p]->getStddev ());
 
  596   stats.push_back (m_dlPduSize[p]->getMin ());
 
  597   stats.push_back (m_dlPduSize[p]->getMax ());
 
  604   if (m_protocolType == 
"RLC")
 
  617   if (m_protocolType == 
"RLC")
 
  630   m_ulPdcpOutputFilename = outputFilename;
 
  636   return m_ulPdcpOutputFilename;
 
  641   m_dlPdcpOutputFilename = outputFilename;
 
  647   return m_dlPdcpOutputFilename;
 
#define NS_LOG_FUNCTION(parameters)
Time GetStartTime() const 
virtual ~RadioBearerStatsCalculator()
std::string GetDlOutputFilename(void)
static TypeId GetTypeId(void)
hold variables of type string 
double GetUlDelay(uint64_t imsi, uint8_t lcid)
std::string GetUlPdcpOutputFilename(void)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetDlRxPackets(uint64_t imsi, uint8_t lcid)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
uint32_t GetUlCellId(uint64_t imsi, uint8_t lcid)
RadioBearerStatsCalculator()
uint32_t GetUlTxPackets(uint64_t imsi, uint8_t lcid)
void SetUlOutputFilename(std::string outputFilename)
std::vector< double > GetUlPduSizeStats(uint64_t imsi, uint8_t lcid)
hold objects of type ns3::Time 
uint64_t GetDlRxData(uint64_t imsi, uint8_t lcid)
void SetUlPdcpOutputFilename(std::string outputFilename)
double GetDlDelay(uint64_t imsi, uint8_t lcid)
void UlTxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
std::string GetDlPdcpOutputFilename(void)
uint32_t GetUlRxPackets(uint64_t imsi, uint8_t lcid)
std::string GetUlOutputFilename(void)
std::string GetUlOutputFilename(void)
void SetStartTime(Time t)
void SetDlOutputFilename(std::string outputFilename)
uint64_t GetDlTxData(uint64_t imsi, uint8_t lcid)
void DlTxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
uint32_t GetDlCellId(uint64_t imsi, uint8_t lcid)
void UlRxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
int64_t GetNanoSeconds(void) const 
uint64_t GetUlTxData(uint64_t imsi, uint8_t lcid)
uint64_t GetUlRxData(uint64_t imsi, uint8_t lcid)
std::vector< double > GetDlDelayStats(uint64_t imsi, uint8_t lcid)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds. 
uint32_t GetDlTxPackets(uint64_t imsi, uint8_t lcid)
#define NS_LOG_DEBUG(msg)
void SetDlPdcpOutputFilename(std::string outputFilename)
#define NS_LOG_ERROR(msg)
std::vector< double > GetUlDelayStats(uint64_t imsi, uint8_t lcid)
std::vector< double > GetDlPduSizeStats(uint64_t imsi, uint8_t lcid)
a unique identifier for an interface. 
TypeId SetParent(TypeId tid)
void DlRxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
std::string GetDlOutputFilename(void)