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)