Added Doxygen documentation to RlcStats

Added lcId to RlcStats API
Modified PF and RR tests to suit the new RlcStatsAPI
This commit is contained in:
jnin
2011-05-12 10:00:52 +02:00
parent a9392a7ee2
commit 264bbb7ba0
8 changed files with 382 additions and 140 deletions

View File

@@ -73,7 +73,7 @@ int main (int argc, char *argv[])
EpsBearer bearer (q);
lena->ActivateEpsBearer (ueDevs, bearer);
Simulator::Stop (Seconds (0.005));
Simulator::Stop (Seconds (4));
lena->EnableMacTraces ();
lena->EnableRlcTraces ();

View File

@@ -354,7 +354,7 @@ LenaHelper::EnableLogComponents (void)
LogComponentEnable ("LteSpectrumPhy", LOG_LEVEL_ALL);
LogComponentEnable ("LteInterference", LOG_LEVEL_ALL);
LogComponentEnable ("LteSinrChunkProcessor", LOG_LEVEL_ALL);
LogComponentEnable ("LtePropagationLossModel", LOG_LEVEL_ALL);
LogComponentEnable ("LossModel", LOG_LEVEL_ALL);
LogComponentEnable ("ShadowingLossModel", LOG_LEVEL_ALL);

View File

@@ -27,6 +27,29 @@
namespace ns3 {
ImsiLcidPair::ImsiLcidPair ()
{
}
ImsiLcidPair::ImsiLcidPair (const uint64_t a, const uint8_t b)
: m_imsi(a),
m_lcId(b)
{
}
bool
operator == (const ImsiLcidPair &a, const ImsiLcidPair &b)
{
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) ) );
}
NS_LOG_COMPONENT_DEFINE ("RlcStatsCalculator");
NS_OBJECT_ENSURE_REGISTERED (RlcStatsCalculator);
@@ -91,11 +114,12 @@ void
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 )
{
m_flowId[imsi] = LteFlowId_t (rnti, lcid);
m_ulTxPackets[imsi]++;
m_ulTxData[imsi] += packetSize;
m_flowId[p] = LteFlowId_t (rnti, lcid);
m_ulTxPackets[p]++;
m_ulTxData[p] += packetSize;
}
CheckEpoch ();
}
@@ -104,11 +128,12 @@ void
RlcStatsCalculator::DlTxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
{
NS_LOG_FUNCTION (this << "DlTxPDU" << imsi << rnti << (uint32_t) lcid << packetSize);
ImsiLcidPair p (imsi, lcid);
if (Simulator::Now () > m_startTime )
{
m_flowId[imsi] = LteFlowId_t (rnti, lcid);
m_dlTxPackets[imsi]++;
m_dlTxData[imsi] += packetSize;
m_flowId[p] = LteFlowId_t (rnti, lcid);
m_dlTxPackets[p]++;
m_dlTxData[p] += packetSize;
}
CheckEpoch ();
}
@@ -117,20 +142,23 @@ void
RlcStatsCalculator::UlRxPdu (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 )
{
m_ulRxPackets[imsi]++;
m_ulRxData[imsi] += packetSize;
m_ulRxPackets[p]++;
m_ulRxData[p] += packetSize;
uint64StatsMap::iterator it = m_ulDelay.find(imsi);
Uint64StatsMap::iterator it = m_ulDelay.find(p);
if (it == m_ulDelay.end())
{
m_ulDelay[imsi] = CreateObject<MinMaxAvgTotalCalculator<uint64_t> > ();
m_ulPduSize[imsi] = CreateObject<MinMaxAvgTotalCalculator<uint32_t> > ();
NS_LOG_DEBUG (this << " Creating UL stats calculators for IMSI " << p.m_imsi << " and LCI " << (uint32_t) p.m_lcId );
m_ulDelay[p] = CreateObject<MinMaxAvgTotalCalculator<uint64_t> > ();
m_ulPduSize[p] = CreateObject<MinMaxAvgTotalCalculator<uint32_t> > ();
}
m_ulDelay[imsi]->Update (delay);
m_ulPduSize[imsi]->Update (packetSize);
m_ulDelay[p]->Update (delay);
m_ulPduSize[p]->Update (packetSize);
}
CheckEpoch ();
}
@@ -138,19 +166,21 @@ void
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 )
{
m_dlRxPackets[imsi]++;
m_dlRxData[imsi] += packetSize;
m_dlRxPackets[p]++;
m_dlRxData[p] += packetSize;
uint64StatsMap::iterator it = m_dlDelay.find(imsi);
Uint64StatsMap::iterator it = m_dlDelay.find(p);
if (it == m_dlDelay.end())
{
m_dlDelay[imsi] = CreateObject<MinMaxAvgTotalCalculator<uint64_t> > ();
m_dlPduSize[imsi] = CreateObject<MinMaxAvgTotalCalculator<uint32_t> > ();
NS_LOG_DEBUG (this << " Creating DL stats calculators for IMSI " << p.m_imsi << " and LCI " << (uint32_t) p.m_lcId );
m_dlDelay[p] = CreateObject<MinMaxAvgTotalCalculator<uint64_t> > ();
m_dlPduSize[p] = CreateObject<MinMaxAvgTotalCalculator<uint32_t> > ();
}
m_dlDelay[imsi]->Update(delay);
m_dlPduSize[imsi]->Update (packetSize);
m_dlDelay[p]->Update(delay);
m_dlPduSize[p]->Update (packetSize);
}
CheckEpoch ();
}
@@ -182,11 +212,11 @@ RlcStatsCalculator::ShowResults (void)
return;
}
m_firstWrite = false;
ulOutFile << "# start\tend\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
ulOutFile << "% start\tend\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\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
dlOutFile << "delay\tstdDev\tmin\tmax\t";
dlOutFile << "PduSize\tstdDev\tmin\tmax";
dlOutFile << std::endl;
@@ -216,34 +246,36 @@ RlcStatsCalculator::ShowResults (void)
void
RlcStatsCalculator::WriteUlResults (std::ofstream& outFile)
{
// Get the unique IMSI list
std::vector<uint64_t> imsiVector;
for (uint32Map::iterator it = m_ulTxPackets.begin(); it != m_ulTxPackets.end(); ++it)
// Get the unique IMSI / LCID list
std::vector<ImsiLcidPair > pairVector;
for (Uint32Map::iterator it = m_ulTxPackets.begin(); it != m_ulTxPackets.end(); ++it)
{
if (find (imsiVector.begin (), imsiVector.end (), (*it).first ) == imsiVector.end () )
if (find (pairVector.begin (), pairVector.end (), (*it).first ) == pairVector.end () )
{
imsiVector.push_back ((*it).first);
pairVector.push_back ((*it).first);
}
}
Time endTime = m_startTime + m_epochDuration;
for (std::vector<uint64_t>::iterator imsi = imsiVector.begin(); imsi != imsiVector.end(); ++imsi)
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 << (*imsi) << "\t";
outFile << m_flowId[*imsi].m_rnti << "\t";
outFile << (uint32_t) m_flowId[*imsi].m_lcId << "\t";
outFile << GetUlTxPackets (*imsi) << "\t";
outFile << GetUlTxData (*imsi) << "\t";
outFile << GetUlRxPackets (*imsi) << "\t";
outFile << GetUlRxData (*imsi) << "\t";
std::vector<double> stats = GetUlDelayStats (*imsi);
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 )
{
outFile << (*it) * 1e-9 << "\t";
}
stats = GetUlPduSizeStats (*imsi);
stats = GetUlPduSizeStats (p.m_imsi, p.m_lcId);
for( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
{
outFile << (*it) << "\t";
@@ -258,33 +290,34 @@ void
RlcStatsCalculator::WriteDlResults (std::ofstream& outFile)
{
// Get the unique IMSI list
std::vector<uint64_t> imsiVector;
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 (imsiVector.begin (), imsiVector.end (), (*it).first ) == imsiVector.end () )
if (find (pairVector.begin (), pairVector.end (), (*it).first ) == pairVector.end () )
{
imsiVector.push_back ((*it).first);
pairVector.push_back ((*it).first);
}
}
Time endTime = m_startTime + m_epochDuration;
for (std::vector<uint64_t>::iterator imsi = imsiVector.begin(); imsi != imsiVector.end(); ++imsi)
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 << (*imsi) << "\t";
outFile << m_flowId[*imsi].m_rnti << "\t";
outFile << (uint32_t) m_flowId[*imsi].m_lcId << "\t";
outFile << GetDlTxPackets (*imsi) << "\t";
outFile << GetDlTxData (*imsi) << "\t";
outFile << GetDlRxPackets (*imsi) << "\t";
outFile << GetDlRxData (*imsi) << "\t";
std::vector<double> stats = GetDlDelayStats (*imsi);
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 )
{
outFile << (*it) * 1e-9 << "\t";
}
stats = GetDlPduSizeStats (*imsi);
stats = GetDlPduSizeStats (p.m_imsi, p.m_lcId);
for( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
{
outFile << (*it) << "\t";
@@ -332,119 +365,132 @@ RlcStatsCalculator::StartEpoch (void)
}
uint32_t
RlcStatsCalculator::GetUlTxPackets (uint64_t imsi)
RlcStatsCalculator::GetUlTxPackets (uint64_t imsi, uint8_t lcid)
{
return m_ulTxPackets[imsi];
ImsiLcidPair p (imsi, lcid);
return m_ulTxPackets[p];
}
uint32_t
RlcStatsCalculator::GetUlRxPackets (uint64_t imsi)
RlcStatsCalculator::GetUlRxPackets (uint64_t imsi, uint8_t lcid)
{
return m_ulRxPackets[imsi];
ImsiLcidPair p (imsi, lcid);
return m_ulRxPackets[p];
}
uint64_t
RlcStatsCalculator::GetUlTxData (uint64_t imsi)
RlcStatsCalculator::GetUlTxData (uint64_t imsi, uint8_t lcid)
{
return m_ulTxData[imsi];
ImsiLcidPair p (imsi, lcid);
return m_ulTxData[p];
}
uint64_t
RlcStatsCalculator::GetUlRxData (uint64_t imsi)
RlcStatsCalculator::GetUlRxData (uint64_t imsi, uint8_t lcid)
{
return m_ulRxData[imsi];
ImsiLcidPair p (imsi, lcid);
return m_ulRxData[p];
}
double
RlcStatsCalculator::GetUlDelay (uint64_t imsi)
RlcStatsCalculator::GetUlDelay (uint64_t imsi, uint8_t lcid)
{
uint64StatsMap::iterator it = m_ulDelay.find (imsi);
ImsiLcidPair p (imsi, lcid);
Uint64StatsMap::iterator it = m_ulDelay.find (p);
if ( it == m_ulDelay.end () )
{
NS_LOG_ERROR("UL delay for " << imsi << " not found");
NS_LOG_ERROR("UL delay for " << imsi << " - " << lcid << " not found");
return 0;
}
return m_ulDelay[imsi]->getMean ();
return m_ulDelay[p]->getMean ();
}
std::vector<double>
RlcStatsCalculator::GetUlDelayStats (uint64_t imsi)
RlcStatsCalculator::GetUlDelayStats (uint64_t imsi, uint8_t lcid)
{
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
uint64StatsMap::iterator it = m_ulDelay.find (imsi);
Uint64StatsMap::iterator it = m_ulDelay.find (p);
if ( it == m_ulDelay.end () )
{
NS_LOG_ERROR("UL delay for " << imsi << " not found");
NS_LOG_ERROR("UL delay for " << imsi << " - " << lcid << " not found");
return stats;
}
stats.push_back(m_ulDelay[imsi]->getMean ());
stats.push_back(m_ulDelay[imsi]->getStddev ());
stats.push_back(m_ulDelay[imsi]->getMin ());
stats.push_back(m_ulDelay[imsi]->getMax ());
stats.push_back(m_ulDelay[p]->getMean ());
stats.push_back(m_ulDelay[p]->getStddev ());
stats.push_back(m_ulDelay[p]->getMin ());
stats.push_back(m_ulDelay[p]->getMax ());
return stats;
}
std::vector<double>
RlcStatsCalculator::GetUlPduSizeStats (uint64_t imsi)
RlcStatsCalculator::GetUlPduSizeStats (uint64_t imsi, uint8_t lcid)
{
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
uint32StatsMap::iterator it = m_ulPduSize.find (imsi);
Uint32StatsMap::iterator it = m_ulPduSize.find (p);
if ( it == m_ulPduSize.end () )
{
NS_LOG_ERROR("UL PDU Size for " << imsi << " not found");
NS_LOG_ERROR("UL PDU Size for " << imsi << " - " << lcid << " not found");
return stats;
}
stats.push_back (m_ulPduSize[imsi]->getMean ());
stats.push_back (m_ulPduSize[imsi]->getStddev ());
stats.push_back (m_ulPduSize[imsi]->getMin ());
stats.push_back (m_ulPduSize[imsi]->getMax ());
stats.push_back (m_ulPduSize[p]->getMean ());
stats.push_back (m_ulPduSize[p]->getStddev ());
stats.push_back (m_ulPduSize[p]->getMin ());
stats.push_back (m_ulPduSize[p]->getMax ());
return stats;
}
uint32_t
RlcStatsCalculator::GetDlTxPackets (uint64_t imsi)
RlcStatsCalculator::GetDlTxPackets (uint64_t imsi, uint8_t lcid)
{
return m_dlTxPackets[imsi];
ImsiLcidPair p (imsi, lcid);
return m_dlTxPackets[p];
}
uint32_t
RlcStatsCalculator::GetDlRxPackets (uint64_t imsi)
RlcStatsCalculator::GetDlRxPackets (uint64_t imsi, uint8_t lcid)
{
return m_dlRxPackets[imsi];
ImsiLcidPair p (imsi, lcid);
return m_dlRxPackets[p];
}
uint64_t
RlcStatsCalculator::GetDlTxData (uint64_t imsi)
RlcStatsCalculator::GetDlTxData (uint64_t imsi, uint8_t lcid)
{
return m_dlTxData[imsi];
ImsiLcidPair p (imsi, lcid);
return m_dlTxData[p];
}
uint64_t
RlcStatsCalculator::GetDlRxData (uint64_t imsi)
RlcStatsCalculator::GetDlRxData (uint64_t imsi, uint8_t lcid)
{
return m_dlRxData[imsi];
ImsiLcidPair p (imsi, lcid);
return m_dlRxData[p];
}
double
RlcStatsCalculator::GetDlDelay (uint64_t imsi)
RlcStatsCalculator::GetDlDelay (uint64_t imsi, uint8_t lcid)
{
uint64StatsMap::iterator it = m_dlDelay.find (imsi);
ImsiLcidPair p (imsi, lcid);
Uint64StatsMap::iterator it = m_dlDelay.find (p);
if ( it == m_dlDelay.end () )
{
NS_LOG_ERROR("DL delay for " << imsi << " not found");
return 0;
}
return m_dlDelay[imsi]->getMean ();
return m_dlDelay[p]->getMean ();
}
std::vector<double>
RlcStatsCalculator::GetDlDelayStats (uint64_t imsi)
RlcStatsCalculator::GetDlDelayStats (uint64_t imsi, uint8_t lcid)
{
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
uint64StatsMap::iterator it = m_dlDelay.find (imsi);
Uint64StatsMap::iterator it = m_dlDelay.find (p);
if ( it == m_dlDelay.end () )
{
@@ -452,18 +498,19 @@ RlcStatsCalculator::GetDlDelayStats (uint64_t imsi)
return stats;
}
stats.push_back(m_dlDelay[imsi]->getMean ());
stats.push_back(m_dlDelay[imsi]->getStddev ());
stats.push_back(m_dlDelay[imsi]->getMin ());
stats.push_back(m_dlDelay[imsi]->getMax ());
stats.push_back(m_dlDelay[p]->getMean ());
stats.push_back(m_dlDelay[p]->getStddev ());
stats.push_back(m_dlDelay[p]->getMin ());
stats.push_back(m_dlDelay[p]->getMax ());
return stats;
}
std::vector<double>
RlcStatsCalculator::GetDlPduSizeStats (uint64_t imsi)
RlcStatsCalculator::GetDlPduSizeStats (uint64_t imsi, uint8_t lcid)
{
ImsiLcidPair p (imsi, lcid);
std::vector<double> stats;
uint32StatsMap::iterator it = m_dlPduSize.find (imsi);
Uint32StatsMap::iterator it = m_dlPduSize.find (p);
if ( it == m_dlPduSize.end () )
{
@@ -471,10 +518,10 @@ RlcStatsCalculator::GetDlPduSizeStats (uint64_t imsi)
return stats;
}
stats.push_back(m_dlPduSize[imsi]->getMean ());
stats.push_back(m_dlPduSize[imsi]->getStddev ());
stats.push_back(m_dlPduSize[imsi]->getMin ());
stats.push_back(m_dlPduSize[imsi]->getMax ());
stats.push_back(m_dlPduSize[p]->getMean ());
stats.push_back(m_dlPduSize[p]->getStddev ());
stats.push_back(m_dlPduSize[p]->getMin ());
stats.push_back(m_dlPduSize[p]->getMax ());
return stats;
}

View File

@@ -32,47 +32,219 @@
namespace ns3 {
typedef std::map<uint64_t, uint32_t> uint32Map;
typedef std::map<uint64_t, uint64_t> uint64Map;
typedef std::map<uint64_t, Ptr<MinMaxAvgTotalCalculator<uint32_t> > > uint32StatsMap;
typedef std::map<uint64_t, Ptr<MinMaxAvgTotalCalculator<uint64_t> > > uint64StatsMap;
typedef std::map<uint64_t, double> doubleMap;
typedef std::map<uint64_t, LteFlowId_t> flowIdMap;
struct ImsiLcidPair
{
uint64_t m_imsi;
uint8_t m_lcId;
public:
ImsiLcidPair ();
ImsiLcidPair (const uint64_t a, const uint8_t b);
friend bool operator == (const ImsiLcidPair &a, const ImsiLcidPair &b);
friend bool operator < (const ImsiLcidPair &a, const ImsiLcidPair &b);
};
typedef std::map<ImsiLcidPair, uint32_t> Uint32Map;
typedef std::map<ImsiLcidPair, uint64_t> Uint64Map;
typedef std::map<ImsiLcidPair, Ptr<MinMaxAvgTotalCalculator<uint32_t> > > Uint32StatsMap;
typedef std::map<ImsiLcidPair, Ptr<MinMaxAvgTotalCalculator<uint64_t> > > Uint64StatsMap;
typedef std::map<ImsiLcidPair, double> DoubleMap;
typedef std::map<ImsiLcidPair, LteFlowId_t> FlowIdMap;
/**
* Calculation of statistics from the RLC layer for uplink and downlink, the data is dumped into a file periodically. Metrics considered are:
* - Number of transmitted PDUs
* - Number of received PDUs
* - Number of transmitted bytes
* - Number of received bytes
* - Average, min, max and standard deviation of RLC to RLC delay
* - Average, min, max and standard deviation of RLC PDU size
*/
class RlcStatsCalculator : public Object
{
public:
RlcStatsCalculator();
virtual
~RlcStatsCalculator();
/**
* Class constructor
*/
RlcStatsCalculator ();
/**
* Class destructor
*/
virtual ~RlcStatsCalculator ();
/**
* Inherited from ns3::Object
*/
static TypeId GetTypeId (void);
/**
* Set the name of the file where the uplink statistics will be stored.
*
* \param outputFilename string with the name of the file
*/
void SetUlOutputFilename (std::string outputFilename);
/**
* Set the name of the file where the downlink statistics will be stored.
*
* \param outputFilename string with the name of the file
*/
void SetDlOutputFilename (std::string outputFilename);
/**
* Notifies the stats calculator that an uplink transmission has occurred.
* @param imsi IMSI of the UE who transmitted the PDU
* @param rnti C-RNTI of the UE who transmitted the PDU
* @param lcid LCID through which the PDU has been transmitted
* @param packetSize size of the PDU in bytes
*/
void UlTxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize);
/**
* Notifies the stats calculator that an uplink reception has occurred.
* @param imsi IMSI of the UE who received the PDU
* @param rnti C-RNTI of the UE who received the PDU
* @param lcid LCID through which the PDU has been received
* @param packetSize size of the PDU in bytes
* @param delay RLC to RLC delay in nanoseconds
*/
void UlRxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay);
/**
* Notifies the stats calculator that an downlink transmission has occurred.
* @param imsi IMSI of the UE who is receiving the PDU
* @param rnti C-RNTI of the UE who is receiving the PDU
* @param lcid LCID through which the PDU has been transmitted
* @param packetSize size of the PDU in bytes
*/
void DlTxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize);
/**
* Notifies the stats calculator that an downlink reception has occurred.
* @param imsi IMSI of the UE who received the PDU
* @param rnti C-RNTI of the UE who received the PDU
* @param lcid LCID through which the PDU has been transmitted
* @param packetSize size of the PDU in bytes
* @param delay RLC to RLC delay in nanoseconds
*/
void DlRxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay);
uint32_t GetUlTxPackets (uint64_t imsi);
uint32_t GetUlRxPackets (uint64_t imsi);
uint64_t GetUlTxData (uint64_t imsi);
uint64_t GetUlRxData (uint64_t imsi);
double GetUlDelay (uint64_t imsi);
std::vector<double> GetUlDelayStats (uint64_t imsi);
std::vector<double> GetUlPduSizeStats (uint64_t imsi);
/**
* Gets the number of transmitted uplink packets.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of transmitted uplink packets
*/
uint32_t GetUlTxPackets (uint64_t imsi, uint8_t lcid);
/**
* Gets the number of received uplink packets.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of received uplink packets
*/
uint32_t GetUlRxPackets (uint64_t imsi, uint8_t lcid);
uint32_t GetDlTxPackets (uint64_t imsi);
uint32_t GetDlRxPackets (uint64_t imsi);
uint64_t GetDlTxData (uint64_t imsi);
uint64_t GetDlRxData (uint64_t imsi);
double GetDlDelay (uint64_t imsi);
std::vector<double> GetDlDelayStats (uint64_t imsi);
std::vector<double> GetDlPduSizeStats (uint64_t imsi);
/**
* Gets the number of transmitted uplink data bytes.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of transmitted data bytes
*/
uint64_t GetUlTxData (uint64_t imsi, uint8_t lcid);
/**
* Gets the number of received uplink data bytes.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of received data bytes
*/
uint64_t GetUlRxData (uint64_t imsi, uint8_t lcid);
/**
* Gets the uplink RLC to RLC delay
* @param imsi IMSI of the UE
* @param lcid LCID
* @return RLC to RLC delay in seconds
*/
double GetUlDelay (uint64_t imsi, uint8_t lcid);
/**
* Gets the uplink RLC to RLC statistics: average, min, max and standard deviation.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return RLC to RLC delay statistics average, min, max and standard deviation in seconds
*/
std::vector<double> GetUlDelayStats (uint64_t imsi, uint8_t lcid);
/**
* Gets the uplink PDU size statistics: average, min, max and standard deviation.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return PDU size statistics average, min, max and standard deviation in seconds
*/
std::vector<double> GetUlPduSizeStats (uint64_t imsi, uint8_t lcid);
/**
* Gets the number of transmitted downlink data bytes.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of transmitted data bytes
*/
uint32_t GetDlTxPackets (uint64_t imsi, uint8_t lcid);
/**
* Gets the number of received downlink data bytes.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of received data bytes
*/
uint32_t GetDlRxPackets (uint64_t imsi, uint8_t lcid);
/**
* Gets the number of transmitted downlink data bytes.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of transmitted data bytes
*/
uint64_t GetDlTxData (uint64_t imsi, uint8_t lcid);
/**
* Gets the number of received downlink data bytes.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return number of received data bytes
*/
uint64_t GetDlRxData (uint64_t imsi, uint8_t lcid);
/**
* Gets the downlink RLC to RLC delay
* @param imsi IMSI of the UE
* @param lcid LCID
* @return RLC to RLC delay in seconds
*/
double GetDlDelay (uint64_t imsi, uint8_t lcid);
/**
* Gets the downlink RLC to RLC statistics: average, min, max and standard deviation.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return RLC to RLC delay statistics average, min, max and standard deviation in seconds
*/
std::vector<double> GetDlDelayStats (uint64_t imsi, uint8_t lcid);
/**
* Gets the downlink PDU size statistics: average, min, max and standard deviation.
* @param imsi IMSI of the UE
* @param lcid LCID
* @return PDU size statistics average, min, max and standard deviation in seconds
*/
std::vector<double> GetDlPduSizeStats (uint64_t imsi, uint8_t lcid);
private:
void ShowResults (void);
@@ -83,23 +255,23 @@ private:
void StartEpoch (void);
void CheckEpoch (void);
flowIdMap m_flowId;
FlowIdMap m_flowId;
std::string m_dlOutputFilename;
uint32Map m_dlTxPackets;
uint32Map m_dlRxPackets;
uint64Map m_dlTxData;
uint64Map m_dlRxData;
uint64StatsMap m_dlDelay;
uint32StatsMap m_dlPduSize;
Uint32Map m_dlTxPackets;
Uint32Map m_dlRxPackets;
Uint64Map m_dlTxData;
Uint64Map m_dlRxData;
Uint64StatsMap m_dlDelay;
Uint32StatsMap m_dlPduSize;
std::string m_ulOutputFilename;
uint32Map m_ulTxPackets;
uint32Map m_ulRxPackets;
uint64Map m_ulTxData;
uint64Map m_ulRxData;
uint64StatsMap m_ulDelay;
uint32StatsMap m_ulPduSize;
Uint32Map m_ulTxPackets;
Uint32Map m_ulRxPackets;
Uint64Map m_ulTxData;
Uint64Map m_ulRxData;
Uint64StatsMap m_ulDelay;
Uint32StatsMap m_ulPduSize;
/**
* Start time of the on going epoch

View File

@@ -191,6 +191,17 @@ LteUeRrc::GetRnti ()
return m_rnti;
}
std::vector<uint8_t>
LteUeRrc::GetLcIdVector ()
{
std::vector<uint8_t> v;
for (std::map<uint8_t, Ptr<LteRlc> >::iterator it = m_rlcMap.begin(); it != m_rlcMap.end(); ++it)
{
v.push_back(it->first);
}
return v;
}
} // namespace ns3

View File

@@ -122,6 +122,12 @@ public:
*/
uint16_t GetRnti ();
/**
*
* @return a vector with the allocated LCID
*/
std::vector<uint8_t> GetLcIdVector ();
private:
// forwarded from CMAC SAP user
void DoLcConfigCompleted ();

View File

@@ -35,6 +35,7 @@
#include <ns3/mobility-helper.h>
#include <ns3/net-device-container.h>
#include <ns3/lte-ue-net-device.h>
#include <ns3/lte-ue-rrc.h>
#include <ns3/lena-helper.h>
#include "ns3/string.h"
#include "ns3/double.h"
@@ -169,7 +170,9 @@ LenaPfFfMacSchedulerTestCase::DoRun (void)
{
// get the imsi
uint64_t imsi = ueDevs.Get (i)-> GetObject<LteUeNetDevice> ()->GetImsi ();
dlDataRxed.push_back (rlcStats->GetDlRxData (imsi));
// get the lcId
uint8_t lcId = ueDevs.Get (i)-> GetObject<LteUeNetDevice> ()->GetRrc ()->GetLcIdVector ().at(0);
dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / simulationTime << " ref " << m_thrRef);
//NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / simulationTime, m_thrRef, m_thrRef * tolerance, " Unfair Throughput!");
}

View File

@@ -35,6 +35,7 @@
#include <ns3/mobility-helper.h>
#include <ns3/net-device-container.h>
#include <ns3/lte-ue-net-device.h>
#include <ns3/lte-ue-rrc.h>
#include <ns3/lena-helper.h>
#include "ns3/string.h"
#include "ns3/double.h"
@@ -199,7 +200,9 @@ LenaRrFfMacSchedulerTestCase::DoRun (void)
{
// get the imsi
uint64_t imsi = ueDevs.Get (i)-> GetObject<LteUeNetDevice> ()->GetImsi ();
dlDataRxed.push_back (rlcStats->GetDlRxData (imsi));
// get the lcId
uint8_t lcId = ueDevs.Get (i)-> GetObject<LteUeNetDevice> ()->GetRrc ()->GetLcIdVector().at(0);
dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / simulationTime << " ref " << m_thrRef);
NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / simulationTime, m_thrRef, m_thrRef * tolerance, " Unfair Throughput!");
}