--- a/src/lte/examples/lena-first-sim.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/examples/lena-first-sim.cc Mon Apr 11 17:33:28 2011 +0200
@@ -23,11 +23,25 @@
#include "ns3/network-module.h"
#include "ns3/mobility-module.h"
#include "ns3/lte-module.h"
+#include "ns3/config-store.h"
//#include "ns3/gtk-config-store.h"
using namespace ns3;
int main (int argc, char *argv[])
-{
+{
+ CommandLine cmd;
+ cmd.Parse (argc, argv);
+
+ // to save a template default attribute file run it like this:
+ // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+ //
+ // to load a previously created default attribute file
+ // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim
+ // note that the latter will override any of the defaults set via command-line arguments
+ //
+ ConfigStore inputConfig;
+ inputConfig.ConfigureDefaults ();
+
LenaHelper lena;
lena.EnableLogComponents ();
--- a/src/lte/helper/lena-helper.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/helper/lena-helper.cc Mon Apr 11 17:33:28 2011 +0200
@@ -258,15 +258,19 @@
Ptr<LteUeRrc> ueRrc = ueDevice->GetObject<LteUeNetDevice> ()->GetRrc ();
ueRrc->ConfigureUe (rnti);
- // attach UE PHY to eNB
+ // attach UE to eNB
ueDevice->GetObject<LteUeNetDevice> ()->SetTargetEnb (enbDevice->GetObject<LteEnbNetDevice> ());
+
+ // connect at the PHY layer
+ Ptr<LteEnbPhy> enbPhy = enbDevice->GetObject<LteEnbNetDevice> ()->GetPhy ();
+ Ptr<LteUePhy> uePhy = ueDevice->GetObject<LteUeNetDevice> ()->GetPhy ();
+ enbPhy->AddUePhy (rnti, uePhy);
+
// WILD HACK - should be done through PHY SAP, probably passing by RRC
- Ptr<LteUePhy> uePhy = ueDevice->GetObject<LteUeNetDevice> ()->GetPhy ();
uePhy->SetRnti (rnti);
-
- Ptr<LteEnbPhy> enbPhy = enbDevice->GetObject<LteEnbNetDevice> ()->GetPhy ();
- enbPhy->AddUePhy (rnti, uePhy);
+ uePhy->DoSetBandwidth (enbDevice->GetObject<LteEnbNetDevice> ()->GetUlBandwidth (),
+ enbDevice->GetObject<LteEnbNetDevice> ()->GetDlBandwidth ());
}
--- a/src/lte/model/lte-enb-mac.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/lte-enb-mac.cc Mon Apr 11 17:33:28 2011 +0200
@@ -515,7 +515,7 @@
// NS_LOG_FUNCTION (this << msg->GetSourceDevice () << msg->GetDestinationDevice ());
CqiListElement_s dlcqi = msg->GetDlCqi ();
- NS_LOG_FUNCTION(this << "Enb Received DCI rnti" << dlcqi.m_rnti);
+ NS_LOG_FUNCTION(this << "Enb Received DL-CQI rnti" << dlcqi.m_rnti);
m_dlCqiReceived.push_back (dlcqi);
}
--- a/src/lte/model/lte-enb-net-device.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/lte-enb-net-device.cc Mon Apr 11 17:33:28 2011 +0200
@@ -60,6 +60,34 @@
PointerValue (),
MakePointerAccessor (&LteEnbNetDevice::m_rrc),
MakePointerChecker <LteEnbRrc> ())
+ .AddAttribute ("LteEnbMac",
+ "The MAC associated to this EnbNetDevice",
+ PointerValue (),
+ MakePointerAccessor (&LteEnbNetDevice::m_mac),
+ MakePointerChecker <LteEnbMac> ())
+ .AddAttribute ("FfMacScheduler",
+ "The scheduler associated to this EnbNetDevice",
+ PointerValue (),
+ MakePointerAccessor (&LteEnbNetDevice::m_scheduler),
+ MakePointerChecker <FfMacScheduler> ())
+ .AddAttribute ("LteEnbPhy",
+ "The PHY associated to this EnbNetDevice",
+ PointerValue (),
+ MakePointerAccessor (&LteEnbNetDevice::m_phy),
+ MakePointerChecker <LteEnbPhy> ())
+ .AddAttribute ("UlBandwidth",
+ "Uplink bandwidth in number of Resource Blocks",
+ UintegerValue (25),
+ MakeUintegerAccessor (&LteEnbNetDevice::SetUlBandwidth,
+ &LteEnbNetDevice::GetUlBandwidth),
+ MakeUintegerChecker<uint8_t> ())
+ .AddAttribute ("DlBandwidth",
+ "Downlink bandwidth in number of Resource Blocks",
+ UintegerValue (25),
+ MakeUintegerAccessor (&LteEnbNetDevice::SetDlBandwidth,
+ &LteEnbNetDevice::GetDlBandwidth),
+ MakeUintegerChecker<uint8_t> ())
+
;
return tid;
}
@@ -109,22 +137,9 @@
}
-void
-LteEnbNetDevice::UpdateConfig (void)
-{
- NS_LOG_FUNCTION (this);
-
- m_rrc->ConfigureCell (25, 25);
-
- // WILD HACK - should use the PHY SAP instead. Probably should handle this through the RRC
- m_phy->DoSetBandwidth (25,25);
- m_phy->DoSetCellId (m_cellId);
-
-}
-
Ptr<LteEnbMac>
-LteEnbNetDevice::GetMac (void)
+LteEnbNetDevice::GetMac (void) const
{
NS_LOG_FUNCTION (this);
return m_mac;
@@ -139,6 +154,71 @@
}
+Ptr<LteEnbRrc>
+LteEnbNetDevice::GetRrc () const
+{
+ return m_rrc;
+}
+
+uint16_t
+LteEnbNetDevice::GetCellId () const
+{
+ return m_cellId;
+}
+
+uint8_t
+LteEnbNetDevice::GetUlBandwidth () const
+{
+ return m_ulBandwidth;
+}
+
+void
+LteEnbNetDevice::SetUlBandwidth (uint8_t bw)
+{
+ switch (bw)
+ {
+ case 6:
+ case 15:
+ case 25:
+ case 50:
+ case 75:
+ case 100:
+ m_ulBandwidth = bw;
+ break;
+
+ default:
+ NS_FATAL_ERROR ("invalid bandwidth value " << (uint16_t) bw);
+ break;
+ }
+}
+
+uint8_t
+LteEnbNetDevice::GetDlBandwidth () const
+{
+ return m_dlBandwidth;
+}
+
+void
+LteEnbNetDevice::SetDlBandwidth (uint8_t bw)
+{
+ switch (bw)
+ {
+ case 6:
+ case 15:
+ case 25:
+ case 50:
+ case 75:
+ case 100:
+ m_dlBandwidth = bw;
+ break;
+
+ default:
+ NS_FATAL_ERROR ("invalid bandwidth value " << (uint16_t) bw);
+ break;
+ }
+}
+
+
bool
LteEnbNetDevice::DoSend (Ptr<Packet> packet, const Mac48Address& source,
const Mac48Address& dest, uint16_t protocolNumber)
@@ -178,26 +258,17 @@
void
-LteEnbNetDevice::SendIdealPdcchMessage (void)
+LteEnbNetDevice::UpdateConfig (void)
{
NS_LOG_FUNCTION (this);
- /*
- * Get both PDCCH ideal message for UL and DL and
- * set assigned resources to UEs using
- * SendAssignedDLResources and SendAssignedULResources
- */
+
+ m_rrc->ConfigureCell (m_ulBandwidth, m_dlBandwidth);
+
+ // WILD HACK - should use the PHY SAP instead. Probably should handle this through the RRC
+ m_phy->DoSetBandwidth (m_ulBandwidth, m_dlBandwidth);
+ m_phy->DoSetCellId (m_cellId);
+
}
-Ptr<LteEnbRrc>
-LteEnbNetDevice::GetRrc ()
-{
- return m_rrc;
-}
-
-uint16_t
-LteEnbNetDevice::GetCellId ()
-{
- return m_cellId;
-}
} // namespace ns3
--- a/src/lte/model/lte-enb-net-device.h Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/lte-enb-net-device.h Mon Apr 11 17:33:28 2011 +0200
@@ -68,29 +68,43 @@
/**
* \return a pointer to the MAC
*/
- Ptr<LteEnbMac> GetMac (void);
+ Ptr<LteEnbMac> GetMac (void) const;
/**
* \return a pointer to the physical layer.
*/
Ptr<LteEnbPhy> GetPhy (void) const;
-
-
-
- Ptr<LteEnbRrc> GetRrc ();
+
+ /**
+ * \return a pointer to the Radio Resource Control instance of the eNB
+ */
+ Ptr<LteEnbRrc> GetRrc () const;
- /**
- * \brief Send the PDCCH ideal mesages under an
- * ideal control channel
+ /**
+ * \return the Cell Identifier of this eNB
*/
- void SendIdealPdcchMessage (void);
-
+ uint16_t GetCellId () const;
/**
- *
- * \return the Cell Identifier of this eNB
+ * \return the uplink bandwidth in RBs
+ */
+ uint8_t GetUlBandwidth () const;
+
+ /**
+ * \param bw the uplink bandwidth in RBs
*/
- uint16_t GetCellId ();
+ void SetUlBandwidth (uint8_t bw);
+
+ /**
+ * \return the downlink bandwidth in RBs
+ */
+ uint8_t GetDlBandwidth () const;
+
+ /**
+ * \param bw the downlink bandwidth in RBs
+ */
+ void SetDlBandwidth (uint8_t bw);
+
private:
bool DoSend (Ptr<Packet> packet,
@@ -100,6 +114,14 @@
void DoReceive (Ptr<Packet> p);
+ /**
+ * Several attributes (e.g., the bandwidth) are exported as
+ * attributes of the LteEnbNetDevice from a user perspective, but
+ * are actually used also in other modules as well (the RRC, the
+ * PHY, the scheduler...). This methods takes care of updating the
+ * configuration of all modules so that their copy of the attribute
+ * values is in sync with the one in the LteEnbNetDevice.
+ */
void UpdateConfig (void);
Ptr<LteEnbMac> m_mac;
@@ -113,6 +135,10 @@
uint16_t m_cellId; /**< Cell Identifer. Part of the CGI, see TS 29.274, section 8.21.1 */
static uint16_t m_cellIdCounter;
+
+ uint8_t m_dlBandwidth; /**< downlink bandwidth in RBs */
+ uint8_t m_ulBandwidth; /**< uplink bandwidth in RBs */
+
};
} // namespace ns3
--- a/src/lte/model/lte-enb-phy.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/lte-enb-phy.cc Mon Apr 11 17:33:28 2011 +0200
@@ -418,13 +418,14 @@
UlCqi_s ulcqi;
ulcqi.m_type = UlCqi_s::PUSCH;
int i = 0;
+ NS_LOG_DEBUG (this << "EVALUATING UL-CQI");
for (it = sinr.ConstValuesBegin (); it != sinr.ConstValuesEnd (); it++)
{
double sinrdb = 10*log10 ((*it));
// convert from double to fixed point notation Sxxxxxxxxxxx.xxx
int16_t sinrFp = LteFfConverter::double2fpS11dot3 (sinrdb);
ulcqi.m_sinr.push_back (sinrFp);
- //NS_LOG_DEBUG(this << " RB " << i << " SINR FP " << sinrFp << " orig " << sinrdb);
+ NS_LOG_DEBUG(this << " RB " << i << " SINR FP " << sinrFp << " orig " << sinrdb);
i++;
}
return (ulcqi);
--- a/src/lte/model/lte-interference.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/lte-interference.cc Mon Apr 11 17:33:28 2011 +0200
@@ -141,6 +141,8 @@
LteInterference::ConditionallyEvaluateChunk ()
{
NS_LOG_FUNCTION (this);
+ if (m_receiving) NS_LOG_DEBUG (this << " Receiving");
+ NS_LOG_DEBUG (this << " now " << Now () << " last " << m_lastChangeTime);
if (m_receiving && (Now () > m_lastChangeTime))
{
SpectrumValue sinr = (*m_rxSignal) / ((*m_allSignals) - (*m_rxSignal) + (*m_noise));
@@ -150,6 +152,10 @@
(*it)->EvaluateSinrChunk (sinr, duration);
}
}
+ else
+ {
+ NS_LOG_DEBUG (this << " NO EV");
+ }
}
void
--- a/src/lte/model/lte-ue-net-device.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/lte-ue-net-device.cc Mon Apr 11 17:33:28 2011 +0200
@@ -105,11 +105,6 @@
LteUeNetDevice::UpdateConfig (void)
{
NS_LOG_FUNCTION (this);
- /**
- * WILD HACK
- * to be translated to PHY-SAP primitive, or maybe to be set through RRC
- */
- m_phy->DoSetBandwidth (25,25);
}
--- a/src/lte/model/pf-ff-mac-scheduler.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/pf-ff-mac-scheduler.cc Mon Apr 11 17:33:28 2011 +0200
@@ -490,6 +490,7 @@
// NS_LOG_DEBUG (this << "Allocate user " << newEl.m_rnti << " rbg " << rbgPerFlow);
// create the DlDciListElement_s
DlDciListElement_s newDci;
+ std::vector <struct RlcPduListElement_s> newRlcPduLe;
newDci.m_rnti = (*flowIt).m_rnti;
newDci.m_resAlloc = 0;
newDci.m_rbBitmap = 0; // TBD (32 bit bitmap see 7.1.6 of 36.213)
@@ -525,18 +526,16 @@
//NS_LOG_DEBUG (this << " nPRB " << nPRB << " tbSize " << newDci.m_tbsSize.at (0));
rlcPduSize += newDci.m_tbsSize.at (i);
+ RlcPduListElement_s newRlcEl;
+ newRlcEl.m_logicalChannelIdentity = (*flowIt).m_lcId;
+ // NS_LOG_DEBUG (this << "LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity);
+ newRlcEl.m_size = newDci.m_tbsSize.at (i);
+
+ newRlcPduLe.push_back (newRlcEl);
}
newEl.m_dci = newDci;
// ...more parameters -> ingored in this version
- RlcPduListElement_s newRlcEl;
- newRlcEl.m_logicalChannelIdentity = (*flowIt).m_lcId;
- // NS_LOG_DEBUG (this << "LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity);
- newRlcEl.m_size = rlcPduSize; // TBD (max length of RLC-PDU in bytes)
-
- std::vector <struct RlcPduListElement_s> newRlcPduLe;
- newRlcPduLe.push_back (newRlcEl);
-
newEl.m_rlcPduList.push_back (newRlcPduLe);
ret.m_buildDataList.push_back (newEl);
--- a/src/lte/model/rr-ff-mac-scheduler.cc Mon Apr 11 17:29:52 2011 +0200
+++ b/src/lte/model/rr-ff-mac-scheduler.cc Mon Apr 11 17:33:28 2011 +0200
@@ -408,6 +408,7 @@
// NS_LOG_DEBUG (this << "Allocate user " << newEl.m_rnti << " rbg " << rbgPerFlow);
// create the DlDciListElement_s
DlDciListElement_s newDci;
+ std::vector <struct RlcPduListElement_s> newRlcPduLe;
newDci.m_rnti = (*it).m_rnti;
newDci.m_resAlloc = 0;
newDci.m_rbBitmap = 0; // TBD (32 bit bitmap see 7.1.6 of 36.213)
@@ -424,14 +425,14 @@
int rlcPduSize = 0;
for (int i = 0; i < nbOfTbsInNewDci; i++)
{
- std::map <uint16_t,uint8_t>::iterator it = m_p10CqiRxed.find (newDci.m_rnti);
- if (it == m_p10CqiRxed.end ())
+ std::map <uint16_t,uint8_t>::iterator itCqi = m_p10CqiRxed.find (newDci.m_rnti);
+ if (itCqi == m_p10CqiRxed.end ())
{
newDci.m_mcs.push_back (1); // no info on this user -> lowest MCS
}
else
{
- newDci.m_mcs.push_back ( LteAmc::GetMcsFromCqi ((*it).second) );
+ newDci.m_mcs.push_back ( LteAmc::GetMcsFromCqi ((*itCqi).second) );
}
int nPRB = rbgSize * rbgPerFlow;
newDci.m_tbsSize.push_back ( (LteAmc::GetTbSizeFromMcs (newDci.m_mcs.at (i), nPRB) / 8) ); // (size of TB in bytes according to table 7.1.7.2.1-1 of 36.213)
@@ -439,17 +440,17 @@
newDci.m_rv.push_back (0); // TBD (redundancy version)
rlcPduSize += newDci.m_tbsSize.at (i);
+ RlcPduListElement_s newRlcEl;
+ newRlcEl.m_logicalChannelIdentity = (*it).m_logicalChannelIdentity;
+ // NS_LOG_DEBUG (this << "LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity);
+ newRlcEl.m_size = newDci.m_tbsSize.at (i);
+ newRlcPduLe.push_back (newRlcEl);
}
newEl.m_dci = newDci;
// ...more parameters -> ignored in this version
- RlcPduListElement_s newRlcEl;
- newRlcEl.m_logicalChannelIdentity = (*it).m_logicalChannelIdentity;
- // NS_LOG_DEBUG (this << "LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity);
- newRlcEl.m_size = rlcPduSize; // TBD (max length of RLC-PDU in bytes)
- std::vector <struct RlcPduListElement_s> newRlcPduLe;
- newRlcPduLe.push_back (newRlcEl);
+
newEl.m_rlcPduList.push_back (newRlcPduLe);
ret.m_buildDataList.push_back (newEl);