23 #include "ns3/string.h"
24 #include "ns3/nstime.h"
36 : m_firstWrite (true),
37 m_pendingOutput (false),
38 m_protocolType (
"RLC")
44 : m_firstWrite (true),
45 m_pendingOutput (false)
60 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.",
175 Uint64StatsMap::iterator it =
m_ulDelay.find (p);
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> > ();
199 Uint64StatsMap::iterator it =
m_dlDelay.find (p);
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> > ();
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 ())
276 std::vector < ImsiLcidPair_t > pairVector;
279 if (find (pairVector.begin (), pairVector.end (), (*it).first) == pairVector.end ())
281 pairVector.push_back ((*it).first);
287 if (find (pairVector.begin (), pairVector.end (), (*it).first) == pairVector.end ())
289 pairVector.push_back ((*it).first);
294 for (std::vector<ImsiLcidPair_t>::iterator it = pairVector.begin (); it != pairVector.end (); ++it)
297 FlowIdMap::const_iterator flowIdIt =
m_flowId.find (p);
299 "FlowId (imsi " << p.
m_imsi <<
" lcid " << (uint32_t) p.
m_lcId <<
") is missing");
306 outFile << p.
m_imsi <<
"\t";
307 outFile << flowId.
m_rnti <<
"\t";
308 outFile << (uint32_t) flowId.
m_lcId <<
"\t";
314 for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
316 outFile << (*it) * 1e-9 <<
"\t";
319 for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
321 outFile << (*it) <<
"\t";
323 outFile << std::endl;
335 std::vector < ImsiLcidPair_t > pairVector;
338 if (find (pairVector.begin (), pairVector.end (), (*it).first) == pairVector.end ())
340 pairVector.push_back ((*it).first);
346 if (find (pairVector.begin (), pairVector.end (), (*it).first) == pairVector.end ())
348 pairVector.push_back ((*it).first);
353 for (std::vector<ImsiLcidPair_t>::iterator pair = pairVector.begin (); pair != pairVector.end (); ++pair)
356 FlowIdMap::const_iterator flowIdIt =
m_flowId.find (p);
358 "FlowId (imsi " << p.
m_imsi <<
" lcid " << (uint32_t) p.
m_lcId <<
") is missing");
365 outFile << p.
m_imsi <<
"\t";
366 outFile << flowId.
m_rnti <<
"\t";
367 outFile << (uint32_t) flowId.
m_lcId <<
"\t";
373 for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
375 outFile << (*it) * 1e-9 <<
"\t";
378 for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
380 outFile << (*it) <<
"\t";
382 outFile << std::endl;
464 Uint64StatsMap::iterator it =
m_ulDelay.find (p);
467 NS_LOG_ERROR (
"UL delay for " << imsi <<
" - " << (uint16_t) lcid <<
" not found");
479 std::vector<double> stats;
480 Uint64StatsMap::iterator it =
m_ulDelay.find (p);
483 stats.push_back (0.0);
484 stats.push_back (0.0);
485 stats.push_back (0.0);
486 stats.push_back (0.0);
490 stats.push_back (
m_ulDelay[p]->getMean ());
491 stats.push_back (
m_ulDelay[p]->getStddev ());
492 stats.push_back (
m_ulDelay[p]->getMin ());
493 stats.push_back (
m_ulDelay[p]->getMax ());
502 std::vector<double> stats;
503 Uint32StatsMap::iterator it =
m_ulPduSize.find (p);
506 stats.push_back (0.0);
507 stats.push_back (0.0);
508 stats.push_back (0.0);
509 stats.push_back (0.0);
573 Uint64StatsMap::iterator it =
m_dlDelay.find (p);
587 std::vector<double> stats;
588 Uint64StatsMap::iterator it =
m_dlDelay.find (p);
591 stats.push_back (0.0);
592 stats.push_back (0.0);
593 stats.push_back (0.0);
594 stats.push_back (0.0);
598 stats.push_back (
m_dlDelay[p]->getMean ());
599 stats.push_back (
m_dlDelay[p]->getStddev ());
600 stats.push_back (
m_dlDelay[p]->getMin ());
601 stats.push_back (
m_dlDelay[p]->getMax ());
610 std::vector<double> stats;
611 Uint32StatsMap::iterator it =
m_dlPduSize.find (p);
614 stats.push_back (0.0);
615 stats.push_back (0.0);
616 stats.push_back (0.0);
617 stats.push_back (0.0);
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Base class for ***StatsCalculator classes.
std::string GetDlOutputFilename(void)
Get the name of the file where the downlink statistics will be stored.
void SetDlOutputFilename(std::string outputFilename)
Set the name of the file where the downlink statistics will be stored.
void SetUlOutputFilename(std::string outputFilename)
Set the name of the file where the uplink statistics will be stored.
std::string GetUlOutputFilename(void)
Get the name of the file where the uplink statistics will be stored.
Uint32Map m_ulTxPackets
Number of UL TX Packets by (IMSI, LCID) pair.
Uint64StatsMap m_dlDelay
DL delay by (IMSI, LCID) pair.
std::vector< double > GetDlDelayStats(uint64_t imsi, uint8_t lcid)
Gets the downlink RLC to RLC statistics: average, min, max and standard deviation.
std::string GetDlPdcpOutputFilename(void)
Get the name of the file where the downlink PDCP statistics will be stored.
std::string m_protocolType
Protocol type, by default RLC.
RadioBearerStatsCalculator()
Class constructor.
Uint64Map m_dlRxData
Amount of DL RX Data by (IMSI, LCID) pair.
uint64_t GetDlTxData(uint64_t imsi, uint8_t lcid)
Gets the number of transmitted downlink data bytes.
uint32_t GetUlRxPackets(uint64_t imsi, uint8_t lcid)
Gets the number of received uplink packets.
uint32_t GetDlRxPackets(uint64_t imsi, uint8_t lcid)
Gets the number of received downlink data bytes.
std::vector< double > GetDlPduSizeStats(uint64_t imsi, uint8_t lcid)
Gets the downlink PDU size statistics: average, min, max and standard deviation.
void RescheduleEndEpoch()
Reschedules EndEpoch event.
Uint64StatsMap m_ulDelay
UL delay by (IMSI, LCID) pair.
uint32_t GetUlCellId(uint64_t imsi, uint8_t lcid)
Gets the attached Enb cellId.
Uint64Map m_ulRxData
Amount of UL RX Data by (IMSI, LCID) pair.
void DoDispose()
Destructor implementation.
static TypeId GetTypeId(void)
Register this type.
void EndEpoch(void)
Function called in every endEpochEvent.
Time m_startTime
Start time of the on going epoch.
std::string GetUlPdcpOutputFilename(void)
Get the name of the file where the uplink PDCP statistics will be stored.
std::vector< double > GetUlPduSizeStats(uint64_t imsi, uint8_t lcid)
Gets the uplink PDU size statistics: average, min, max and standard deviation.
Uint64Map m_ulTxData
Amount of UL TX Data by (IMSI, LCID) pair.
uint32_t GetDlTxPackets(uint64_t imsi, uint8_t lcid)
Gets the number of transmitted downlink data bytes.
Uint32StatsMap m_ulPduSize
UL PDU Size by (IMSI, LCID) pair.
EventId m_endEpochEvent
Event id for next end epoch event.
void ResetResults(void)
Erases collected statistics.
void UlRxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
Notifies the stats calculator that an uplink reception has occurred.
uint64_t GetUlRxData(uint64_t imsi, uint8_t lcid)
Gets the number of received uplink data bytes.
std::string m_dlPdcpOutputFilename
Name of the file where the downlink PDCP statistics will be saved.
void ShowResults(void)
Called after each epoch to write collected statistics to output files.
void UlTxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
Notifies the stats calculator that an uplink transmission has occurred.
uint64_t GetDlRxData(uint64_t imsi, uint8_t lcid)
Gets the number of received downlink data bytes.
Uint32Map m_dlRxPackets
Number of DL RX Packets by (IMSI, LCID) pair.
void DlTxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
Notifies the stats calculator that an downlink transmission has occurred.
std::string GetDlOutputFilename(void)
Get the name of the file where the downlink statistics will be stored.
uint64_t GetUlTxData(uint64_t imsi, uint8_t lcid)
Gets the number of transmitted uplink data bytes.
std::string m_ulPdcpOutputFilename
Name of the file where the uplink PDCP statistics will be saved.
void DlRxPdu(uint16_t cellId, uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
Notifies the stats calculator that an downlink reception has occurred.
void WriteDlResults(std::ofstream &outFile)
Writes collected statistics to DL output file and closes DL output file.
Uint32StatsMap m_dlPduSize
DL PDU Size by (IMSI, LCID) pair.
Uint32Map m_ulRxPackets
Number of UL RX Packets by (IMSI, LCID) pair.
void SetStartTime(Time t)
bool m_firstWrite
true if output files have not been opened yet
FlowIdMap m_flowId
List of FlowIds, ie.
virtual ~RadioBearerStatsCalculator()
Class destructor.
uint32_t GetDlCellId(uint64_t imsi, uint8_t lcid)
Gets the attached Enb cellId.
double GetDlDelay(uint64_t imsi, uint8_t lcid)
Gets the downlink RLC to RLC delay.
void WriteUlResults(std::ofstream &outFile)
Writes collected statistics to UL output file and closes UL output file.
double GetUlDelay(uint64_t imsi, uint8_t lcid)
Gets the uplink RLC to RLC delay.
Time GetStartTime() const
void SetUlPdcpOutputFilename(std::string outputFilename)
Set the name of the file where the uplink PDCP statistics will be stored.
Time m_epochDuration
Epoch duration.
Uint32Map m_ulCellId
List of UL CellIds by (IMSI, LCID) pair.
uint32_t GetUlTxPackets(uint64_t imsi, uint8_t lcid)
Gets the number of transmitted uplink packets.
Uint32Map m_dlCellId
List of DL CellIds by (IMSI, LCID) pair.
std::vector< double > GetUlDelayStats(uint64_t imsi, uint8_t lcid)
Gets the uplink RLC to RLC statistics: average, min, max and standard deviation.
Uint32Map m_dlTxPackets
Number of DL TX Packets by (IMSI, LCID) pair.
bool m_pendingOutput
true if any output is pending
std::string GetUlOutputFilename(void)
Get the name of the file where the uplink statistics will be stored.
Uint64Map m_dlTxData
Amount of DL TX Data by (IMSI, LCID) pair.
void SetDlPdcpOutputFilename(std::string outputFilename)
Set the name of the file where the downlink PDCP statistics will be stored.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static Time Now(void)
Return the current simulation virtual time.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeAccessor > MakeStringAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeChecker > MakeStringChecker(void)
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
static const uint32_t packetSize