--- a/src/lte/helper/rlc-stats-calculator.cc Thu Jun 23 11:31:44 2011 +0200
+++ b/src/lte/helper/rlc-stats-calculator.cc Mon Jun 27 14:28:58 2011 +0200
@@ -40,16 +40,16 @@
bool
operator == (const ImsiLcidPair &a, const ImsiLcidPair &b)
{
- return ( (a.m_imsi == b.m_imsi) && (a.m_lcId == b.m_lcId) );
+ return ((a.m_imsi == b.m_imsi) && (a.m_lcId == b.m_lcId));
}
bool
operator < (const ImsiLcidPair& a, const ImsiLcidPair& b)
{
- return ( (a.m_imsi < b.m_imsi) || ( (a.m_imsi == b.m_imsi) && (a.m_lcId < b.m_lcId) ) );
+ return ((a.m_imsi < b.m_imsi) || ((a.m_imsi == b.m_imsi) && (a.m_lcId
+ < b.m_lcId)));
}
-
NS_LOG_COMPONENT_DEFINE ("RlcStatsCalculator");
NS_OBJECT_ENSURE_REGISTERED (RlcStatsCalculator);
@@ -72,29 +72,23 @@
TypeId
RlcStatsCalculator::GetTypeId (void)
{
- static TypeId tid = TypeId ("ns3::RlcStatsCalculator")
- .SetParent<Object> ()
- .AddConstructor<RlcStatsCalculator> ()
- .AddAttribute ("DlOutputFilename",
- "Name of the file where the downlink results will be saved.",
- StringValue ("DlRlcStats.csv"),
- MakeStringAccessor (&RlcStatsCalculator::SetDlOutputFilename),
- MakeStringChecker ())
- .AddAttribute ("UlOutputFilename",
- "Name of the file where the uplink results will be saved.",
- StringValue ("UlRlcStats.csv"),
- MakeStringAccessor (&RlcStatsCalculator::SetUlOutputFilename),
- MakeStringChecker ())
- .AddAttribute ("StartTime",
- "Start time of the on going epoch.",
- TimeValue ( Seconds (0.) ),
- MakeTimeAccessor (&RlcStatsCalculator::m_startTime),
- MakeTimeChecker ())
- .AddAttribute ("EpochDuration",
- "Epoch duration.", TimeValue (Seconds (0.25)),
- MakeTimeAccessor (&RlcStatsCalculator::m_epochDuration),
- MakeTimeChecker ())
- ;
+ static TypeId
+ tid =
+ TypeId ("ns3::RlcStatsCalculator").SetParent<Object> ().AddConstructor<
+ RlcStatsCalculator> ().AddAttribute ("DlOutputFilename",
+ "Name of the file where the downlink results will be saved.",
+ StringValue ("DlRlcStats.csv"), MakeStringAccessor (
+ &RlcStatsCalculator::SetDlOutputFilename),
+ MakeStringChecker ()).AddAttribute ("UlOutputFilename",
+ "Name of the file where the uplink results will be saved.",
+ StringValue ("UlRlcStats.csv"), MakeStringAccessor (
+ &RlcStatsCalculator::SetUlOutputFilename),
+ MakeStringChecker ()).AddAttribute ("StartTime",
+ "Start time of the on going epoch.", TimeValue (Seconds (0.)),
+ MakeTimeAccessor (&RlcStatsCalculator::m_startTime),
+ MakeTimeChecker ()).AddAttribute ("EpochDuration",
+ "Epoch duration.", TimeValue (Seconds (0.25)), MakeTimeAccessor (
+ &RlcStatsCalculator::m_epochDuration), MakeTimeChecker ());
return tid;
}
@@ -111,11 +105,12 @@
}
void
-RlcStatsCalculator::UlTxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
+RlcStatsCalculator::UlTxPdu (uint64_t imsi, uint16_t rnti,
+ uint8_t lcid, uint32_t packetSize)
{
NS_LOG_FUNCTION (this << "UlTxPDU" << imsi << rnti << (uint32_t) lcid << packetSize);
ImsiLcidPair p (imsi, lcid);
- if (Simulator::Now () > m_startTime )
+ if (Simulator::Now () > m_startTime)
{
m_flowId[p] = LteFlowId_t (rnti, lcid);
m_ulTxPackets[p]++;
@@ -125,26 +120,51 @@
}
void
-RlcStatsCalculator::DlTxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
+RlcStatsCalculator::DlTxPdu (uint16_t cellId, uint64_t imsi, uint16_t rnti,
+ uint8_t lcid, uint32_t packetSize)
{
- NS_LOG_FUNCTION (this << "DlTxPDU" << imsi << rnti << (uint32_t) lcid << packetSize);
+ NS_LOG_FUNCTION (this << "DlTxPDU" << imsi << rnti << (uint32_t) lcid << packetSize);
ImsiLcidPair p (imsi, lcid);
- if (Simulator::Now () > m_startTime )
+ bool forceEpoch = false;
+ if (Simulator::Now () > m_startTime)
{
+
+ // If the UE hands off to another cell, restart the epoch automatically
+ if (m_dlCellId[p] != 0 && m_dlCellId[p] != cellId)
+ {
+ forceEpoch = true;
+ }
+ else
+ {
+ m_dlCellId[p] = cellId;
+ }
m_flowId[p] = LteFlowId_t (rnti, lcid);
m_dlTxPackets[p]++;
m_dlTxData[p] += packetSize;
}
- CheckEpoch ();
+ CheckEpoch (forceEpoch);
}
void
-RlcStatsCalculator::UlRxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
+RlcStatsCalculator::UlRxPdu (uint16_t cellId, uint64_t imsi, uint16_t rnti,
+ uint8_t lcid, uint32_t packetSize, uint64_t delay)
{
NS_LOG_FUNCTION (this << "UlRxPDU" << imsi << rnti << (uint32_t) lcid << packetSize << delay);
ImsiLcidPair p (imsi, lcid);
- if (Simulator::Now () > m_startTime )
+ bool forceEpoch = false;
+
+ if (Simulator::Now () > m_startTime)
{
+ // If the UE hands off to another cell, restart the epoch automatically
+ if (m_ulCellId[p] != 0 && m_ulCellId[p] != cellId)
+ {
+ forceEpoch = true;
+ }
+ else
+ {
+ m_ulCellId[p] = cellId;
+ }
+
m_ulRxPackets[p]++;
m_ulRxData[p] += packetSize;
@@ -159,15 +179,16 @@
m_ulPduSize[p]->Update (packetSize);
}
- CheckEpoch ();
+ CheckEpoch (forceEpoch);
}
void
-RlcStatsCalculator::DlRxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
+RlcStatsCalculator::DlRxPdu (uint64_t imsi, uint16_t rnti,
+ uint8_t lcid, uint32_t packetSize, uint64_t delay)
{
NS_LOG_FUNCTION (this << "DlRxPDU" << imsi << rnti << (uint32_t) lcid << packetSize << delay);
ImsiLcidPair p (imsi, lcid);
- if (Simulator::Now () > m_startTime )
+ if (Simulator::Now () > m_startTime)
{
m_dlRxPackets[p]++;
m_dlRxData[p] += packetSize;
@@ -189,14 +210,14 @@
RlcStatsCalculator::ShowResults (void)
{
- NS_LOG_FUNCTION (this << m_ulOutputFilename.c_str () << m_dlOutputFilename.c_str () );
+ NS_LOG_FUNCTION (this << m_ulOutputFilename.c_str () << m_dlOutputFilename.c_str () );
NS_LOG_INFO ("Write Rlc Stats in " << m_ulOutputFilename.c_str () <<
" and in " << m_dlOutputFilename.c_str ());
std::ofstream ulOutFile;
std::ofstream dlOutFile;
- if ( m_firstWrite == true )
+ if (m_firstWrite == true)
{
ulOutFile.open (m_ulOutputFilename.c_str ());
if (!ulOutFile.is_open ())
@@ -212,25 +233,27 @@
return;
}
m_firstWrite = false;
- ulOutFile << "% start\tend\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
+ ulOutFile
+ << "% start\tend\tCellId\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
ulOutFile << "delay\tstdDev\tmin\tmax\t";
ulOutFile << "PduSize\tstdDev\tmin\tmax";
ulOutFile << std::endl;
- dlOutFile << "% start\tend\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
+ dlOutFile
+ << "% start\tend\tCellId\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
dlOutFile << "delay\tstdDev\tmin\tmax\t";
dlOutFile << "PduSize\tstdDev\tmin\tmax";
dlOutFile << std::endl;
}
else
{
- ulOutFile.open (m_ulOutputFilename.c_str (), std::ios_base::app);
+ ulOutFile.open (m_ulOutputFilename.c_str (), std::ios_base::app);
if (!ulOutFile.is_open ())
{
NS_LOG_ERROR ("Can't open file " << m_ulOutputFilename.c_str ());
return;
}
- dlOutFile.open (m_dlOutputFilename.c_str (), std::ios_base::app);
+ dlOutFile.open (m_dlOutputFilename.c_str (), std::ios_base::app);
if (!dlOutFile.is_open ())
{
NS_LOG_ERROR ("Can't open file " << m_dlOutputFilename.c_str ());
@@ -248,35 +271,39 @@
{
// Get the unique IMSI / LCID list
- std::vector<ImsiLcidPair > pairVector;
- for (Uint32Map::iterator it = m_ulTxPackets.begin (); it != m_ulTxPackets.end (); ++it)
+ std::vector<ImsiLcidPair> pairVector;
+ for (Uint32Map::iterator it = m_ulTxPackets.begin (); it
+ != m_ulTxPackets.end (); ++it)
{
- if (find (pairVector.begin (), pairVector.end (), (*it).first ) == pairVector.end () )
+ if (find (pairVector.begin (), pairVector.end (), (*it).first)
+ == pairVector.end ())
{
pairVector.push_back ((*it).first);
}
}
Time endTime = m_startTime + m_epochDuration;
- for (std::vector<ImsiLcidPair>::iterator it = pairVector.begin (); it != pairVector.end (); ++it)
+ for (std::vector<ImsiLcidPair>::iterator it = pairVector.begin (); it
+ != pairVector.end (); ++it)
{
ImsiLcidPair p = *it;
outFile << m_startTime.GetNanoSeconds () / 1.0e9 << "\t";
- outFile << endTime.GetNanoSeconds () / 1.0e9 << "\t";
- outFile << p.m_imsi << "\t";
- outFile << m_flowId[p].m_rnti << "\t";
- outFile << (uint32_t) m_flowId[p].m_lcId << "\t";
- outFile << GetUlTxPackets (p.m_imsi, p.m_lcId) << "\t";
- outFile << GetUlTxData (p.m_imsi, p.m_lcId) << "\t";
- outFile << GetUlRxPackets (p.m_imsi, p.m_lcId) << "\t";
- outFile << GetUlRxData (p.m_imsi, p.m_lcId) << "\t";
+ outFile << endTime.GetNanoSeconds () / 1.0e9 << "\t";
+ outFile << GetUlCellId (p.m_imsi, p.m_lcId) << "\t";
+ outFile << p.m_imsi << "\t";
+ outFile << m_flowId[p].m_rnti << "\t";
+ outFile << (uint32_t) m_flowId[p].m_lcId << "\t";
+ outFile << GetUlTxPackets (p.m_imsi, p.m_lcId) << "\t";
+ outFile << GetUlTxData (p.m_imsi, p.m_lcId) << "\t";
+ outFile << GetUlRxPackets (p.m_imsi, p.m_lcId) << "\t";
+ outFile << GetUlRxData (p.m_imsi, p.m_lcId) << "\t";
std::vector<double> stats = GetUlDelayStats (p.m_imsi, p.m_lcId);
- for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+ for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
{
outFile << (*it) * 1e-9 << "\t";
}
stats = GetUlPduSizeStats (p.m_imsi, p.m_lcId);
- for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+ for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
{
outFile << (*it) << "\t";
}
@@ -290,35 +317,39 @@
RlcStatsCalculator::WriteDlResults (std::ofstream& outFile)
{
// Get the unique IMSI list
- std::vector<ImsiLcidPair > pairVector;
- for (Uint32Map::iterator it = m_dlTxPackets.begin (); it != m_dlTxPackets.end (); ++it)
+ std::vector<ImsiLcidPair> pairVector;
+ for (Uint32Map::iterator it = m_dlTxPackets.begin (); it
+ != m_dlTxPackets.end (); ++it)
{
- if (find (pairVector.begin (), pairVector.end (), (*it).first ) == pairVector.end () )
+ if (find (pairVector.begin (), pairVector.end (), (*it).first)
+ == pairVector.end ())
{
pairVector.push_back ((*it).first);
}
}
Time endTime = m_startTime + m_epochDuration;
- for (std::vector<ImsiLcidPair>::iterator pair = pairVector.begin (); pair != pairVector.end (); ++pair)
+ for (std::vector<ImsiLcidPair>::iterator pair = pairVector.begin (); pair
+ != pairVector.end (); ++pair)
{
ImsiLcidPair p = *pair;
outFile << m_startTime.GetNanoSeconds () / 1.0e9 << "\t";
- outFile << endTime.GetNanoSeconds () / 1.0e9 << "\t";
- outFile << p.m_imsi << "\t";
- outFile << m_flowId[p].m_rnti << "\t";
- outFile << (uint32_t) m_flowId[p].m_lcId << "\t";
- outFile << GetDlTxPackets (p.m_imsi, p.m_lcId) << "\t";
- outFile << GetDlTxData (p.m_imsi, p.m_lcId) << "\t";
- outFile << GetDlRxPackets (p.m_imsi, p.m_lcId) << "\t";
- outFile << GetDlRxData (p.m_imsi, p.m_lcId) << "\t";
+ outFile << endTime.GetNanoSeconds () / 1.0e9 << "\t";
+ outFile << GetDlCellId (p.m_imsi, p.m_lcId) << "\t";
+ outFile << p.m_imsi << "\t";
+ outFile << m_flowId[p].m_rnti << "\t";
+ outFile << (uint32_t) m_flowId[p].m_lcId << "\t";
+ outFile << GetDlTxPackets (p.m_imsi, p.m_lcId) << "\t";
+ outFile << GetDlTxData (p.m_imsi, p.m_lcId) << "\t";
+ outFile << GetDlRxPackets (p.m_imsi, p.m_lcId) << "\t";
+ outFile << GetDlRxData (p.m_imsi, p.m_lcId) << "\t";
std::vector<double> stats = GetDlDelayStats (p.m_imsi, p.m_lcId);
- for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+ for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
{
outFile << (*it) * 1e-9 << "\t";
}
stats = GetDlPduSizeStats (p.m_imsi, p.m_lcId);
- for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+ for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
{
outFile << (*it) << "\t";
}
@@ -331,27 +362,26 @@
void
RlcStatsCalculator::ResetResults (void)
{
- m_ulTxPackets.erase (m_ulTxPackets.begin (), m_ulTxPackets.end () );
- m_ulRxPackets.erase (m_ulRxPackets.begin (), m_ulRxPackets.end () );
- m_ulRxData.erase (m_ulRxData.begin (), m_ulRxData.end () );
- m_ulTxData.erase (m_ulTxData.begin (), m_ulTxData.end () );
- m_ulDelay.erase (m_ulDelay.begin (), m_ulDelay.end () );
- m_ulPduSize.erase (m_ulPduSize.begin (), m_ulPduSize.end () );
+ m_ulTxPackets.erase (m_ulTxPackets.begin (), m_ulTxPackets.end ());
+ m_ulRxPackets.erase (m_ulRxPackets.begin (), m_ulRxPackets.end ());
+ m_ulRxData.erase (m_ulRxData.begin (), m_ulRxData.end ());
+ m_ulTxData.erase (m_ulTxData.begin (), m_ulTxData.end ());
+ m_ulDelay.erase (m_ulDelay.begin (), m_ulDelay.end ());
+ m_ulPduSize.erase (m_ulPduSize.begin (), m_ulPduSize.end ());
- m_dlTxPackets.erase (m_dlTxPackets.begin (), m_dlTxPackets.end () );
- m_dlRxPackets.erase (m_dlRxPackets.begin (), m_dlRxPackets.end () );
- m_dlRxData.erase (m_dlRxData.begin (), m_dlRxData.end () );
- m_dlTxData.erase (m_dlTxData.begin (), m_dlTxData.end () );
- m_dlDelay.erase (m_dlDelay.begin (), m_dlDelay.end () );
- m_dlPduSize.erase (m_dlPduSize.begin (), m_dlPduSize.end () );
+ m_dlTxPackets.erase (m_dlTxPackets.begin (), m_dlTxPackets.end ());
+ m_dlRxPackets.erase (m_dlRxPackets.begin (), m_dlRxPackets.end ());
+ m_dlRxData.erase (m_dlRxData.begin (), m_dlRxData.end ());
+ m_dlTxData.erase (m_dlTxData.begin (), m_dlTxData.end ());
+ m_dlDelay.erase (m_dlDelay.begin (), m_dlDelay.end ());
+ m_dlPduSize.erase (m_dlPduSize.begin (), m_dlPduSize.end ());
}
void
-RlcStatsCalculator::CheckEpoch (void)
+RlcStatsCalculator::CheckEpoch (bool forceEpoch)
{
- if ( Simulator::Now () > m_startTime + m_epochDuration )
+ if (Simulator::Now () > m_startTime + m_epochDuration /*|| forceEpoch == true*/)
{
- std::cout << "JNNNNNNNNNG New epoch! startTime " << m_startTime << " epoch duration " << m_epochDuration << std::endl;
ShowResults ();
ResetResults ();
StartEpoch ();
@@ -398,7 +428,7 @@
{
ImsiLcidPair p (imsi, lcid);
Uint64StatsMap::iterator it = m_ulDelay.find (p);
- if ( it == m_ulDelay.end () )
+ if (it == m_ulDelay.end ())
{
NS_LOG_ERROR ("UL delay for " << imsi << " - " << lcid << " not found");
return 0;
@@ -413,9 +443,9 @@
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
Uint64StatsMap::iterator it = m_ulDelay.find (p);
- if ( it == m_ulDelay.end () )
+ if (it == m_ulDelay.end ())
{
- NS_LOG_ERROR ("UL delay for " << imsi << " - " << lcid << " not found");
+ NS_LOG_ERROR ("UL delay for " << imsi << " - " << lcid << " not found");
return stats;
}
@@ -432,7 +462,7 @@
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
Uint32StatsMap::iterator it = m_ulPduSize.find (p);
- if ( it == m_ulPduSize.end () )
+ if (it == m_ulPduSize.end ())
{
NS_LOG_ERROR ("UL PDU Size for " << imsi << " - " << lcid << " not found");
return stats;
@@ -473,12 +503,26 @@
return m_dlRxData[p];
}
+uint32_t
+RlcStatsCalculator::GetUlCellId (uint64_t imsi, uint8_t lcid)
+{
+ ImsiLcidPair p (imsi, lcid);
+ return m_ulCellId[p];
+}
+
+uint32_t
+RlcStatsCalculator::GetDlCellId (uint64_t imsi, uint8_t lcid)
+{
+ ImsiLcidPair p (imsi, lcid);
+ return m_dlCellId[p];
+}
+
double
RlcStatsCalculator::GetDlDelay (uint64_t imsi, uint8_t lcid)
{
ImsiLcidPair p (imsi, lcid);
Uint64StatsMap::iterator it = m_dlDelay.find (p);
- if ( it == m_dlDelay.end () )
+ if (it == m_dlDelay.end ())
{
NS_LOG_ERROR ("DL delay for " << imsi << " not found");
return 0;
@@ -492,10 +536,10 @@
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
Uint64StatsMap::iterator it = m_dlDelay.find (p);
- if ( it == m_dlDelay.end () )
+ if (it == m_dlDelay.end ())
{
- NS_LOG_ERROR ("DL delay for " << imsi << " not found");
+ NS_LOG_ERROR ("DL delay for " << imsi << " not found");
return stats;
}
@@ -512,7 +556,7 @@
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
Uint32StatsMap::iterator it = m_dlPduSize.find (p);
- if ( it == m_dlPduSize.end () )
+ if (it == m_dlPduSize.end ())
{
NS_LOG_ERROR ("DL delay for " << imsi << " not found");