PHY synchronization
authorNicola Baldo <nbaldo@cttc.es>
Tue, 15 Mar 2011 20:01:50 +0100
changeset 7893 8dba98ae26ee
parent 7892 1d4af3ea8908
child 7894 ed34ceddb62f
PHY synchronization
src/lte/examples/inter-cell-interference.cc
src/lte/model/lte-phy.h
src/lte/model/lte-spectrum-phy.cc
src/lte/model/lte-ue-net-device.cc
src/lte/model/lte-ue-net-device.h
src/lte/model/lte-ue-phy.cc
src/lte/model/lte-ue-phy.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lte/examples/inter-cell-interference.cc	Tue Mar 15 20:01:50 2011 +0100
@@ -0,0 +1,69 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Manuel Requena <manuel.requena@cttc.es>
+ *         Nicola Baldo <nbaldo@cttc.es>
+ */
+
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/lte-module.h"
+
+using namespace ns3;
+
+int main (int argc, char *argv[])
+{
+  LenaHelper lena;
+
+  lena.EnableLogComponents ();
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  NodeContainer ueNodes;
+  enbNodes.Create (1);
+  ueNodes.Create (1);
+
+  // Install Mobility Model
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (ueNodes);
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  NetDeviceContainer ueDevs;
+  enbDevs = lena.InstallEnbDevice (enbNodes);
+  ueDevs = lena.InstallUeDevice (ueNodes);
+
+  // Attach a UE to a eNB
+  lena.Attach (ueDevs, enbDevs.Get (0));
+
+  // Activate an EPS bearer
+  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
+  EpsBearer bearer (q);
+  lena.ActivateEpsBearer (ueDevs, bearer);
+
+
+  Simulator::Stop (Seconds (0.004));
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+  return 0;
+}
--- a/src/lte/model/lte-phy.h	Tue Mar 15 11:22:52 2011 +0100
+++ b/src/lte/model/lte-phy.h	Tue Mar 15 20:01:50 2011 +0100
@@ -246,7 +246,8 @@
 
 
   
-private:
+protected:
+
   Ptr<LteNetDevice> m_netDevice;
 
   Ptr<LteSpectrumPhy> m_downlinkSpectrumPhy;
--- a/src/lte/model/lte-spectrum-phy.cc	Tue Mar 15 11:22:52 2011 +0100
+++ b/src/lte/model/lte-spectrum-phy.cc	Tue Mar 15 20:01:50 2011 +0100
@@ -236,7 +236,7 @@
 LteSpectrumPhy::StartTx (Ptr<PacketBurst> pb)
 {
   NS_LOG_FUNCTION (this << pb);
-  NS_LOG_LOGIC (this << "state: " << m_state);
+  NS_LOG_LOGIC (this << " state: " << m_state);
 
 
   for (std::list<Ptr<Packet> >::const_iterator iter = pb->Begin (); iter
@@ -296,7 +296,7 @@
 LteSpectrumPhy::EndTx ()
 {
   NS_LOG_FUNCTION (this);
-  NS_LOG_LOGIC (this << "state: " << m_state);
+  NS_LOG_LOGIC (this << " state: " << m_state);
 
   NS_ASSERT (m_state == TX);
 
@@ -326,7 +326,7 @@
 LteSpectrumPhy::StartRx (Ptr<PacketBurst> pb, Ptr <const SpectrumValue> rxPsd, SpectrumType st, Time duration)
 {
   NS_LOG_FUNCTION (this << pb << rxPsd << st << duration);
-  NS_LOG_LOGIC (this << "state: " << m_state);
+  NS_LOG_LOGIC (this << " state: " << m_state);
 
   m_interference.AddSignal (rxPsd, duration);
 
@@ -337,51 +337,54 @@
       switch (m_state)
         {
         case TX:
-          /*
-           * NS FATAL ERROR: according to FDD channel acces,
-           * the physical layer for reception cannot be used for transmission.
-           */
-          NS_FATAL_ERROR ("FDD ERROR: TX State while receiving packet");
-
+          NS_FATAL_ERROR ("cannot RX while TX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
           break;
 
         case RX:
           break;
 
         case IDLE:
-
-          // To check if we're synchronized to this signal, we check
-          // for the CellId which is reported in the LtePhyTag
-          NS_ASSERT (pb->Begin () != pb->End ());          
-          LtePhyTag tag;
-          Ptr<Packet> firstPacketInBurst = *(pb->Begin ());
-          firstPacketInBurst->RemovePacketTag (tag);
-          if (tag.GetCellId () == m_cellId)
-            {
-              // we're synchronized with this signal
-              ChangeState (RX);
+          {
+            // To check if we're synchronized to this signal, we check
+            // for the CellId which is reported in the LtePhyTag
+            NS_ASSERT (pb->Begin () != pb->End ());          
+            LtePhyTag tag;
+            Ptr<Packet> firstPacketInBurst = *(pb->Begin ());
+            firstPacketInBurst->RemovePacketTag (tag);
+            if (tag.GetCellId () == m_cellId)
+              {
+                NS_LOG_LOGIC (this << " synchronized with this signal (cellId=" << tag.GetCellId () << ")");
+                ChangeState (RX);
               
-              m_interference.StartRx (rxPsd);
+                m_interference.StartRx (rxPsd);
   
-              for (std::list<Ptr<Packet> >::const_iterator iter = pb->Begin (); iter
-                     != pb->End (); ++iter)
-                {
-                  Ptr<Packet> packet = (*iter)->Copy ();
-                  m_phyRxStartTrace (packet);
-                }
+                for (std::list<Ptr<Packet> >::const_iterator iter = pb->Begin (); iter
+                       != pb->End (); ++iter)
+                  {
+                    Ptr<Packet> packet = (*iter)->Copy ();
+                    m_phyRxStartTrace (packet);
+                  }
+              
+                m_rxPacketBurst = pb;
+                m_rxPsd = rxPsd;              
               
-              m_rxPacketBurst = pb;
-              m_rxPsd = rxPsd;              
-              
-              NS_LOG_LOGIC (this << " scheduling EndRx with delay " << duration);
-              m_endRxEventId = Simulator::Schedule (duration, &LteSpectrumPhy::EndRx, this);
-
-              break;
-
-            }
+                NS_LOG_LOGIC (this << " scheduling EndRx with delay " << duration);
+                m_endRxEventId = Simulator::Schedule (duration, &LteSpectrumPhy::EndRx, this);
+              }      
+            else
+              {
+                NS_LOG_LOGIC (this << " not in sync with this signal (cellId=" 
+                              << tag.GetCellId () << ", m_cellId=" << m_cellId << ")");
+              }
+          }
+          break;
+          
+        default:
+          NS_FATAL_ERROR ("unknown state");
+          break;
         }
 
-      NS_LOG_LOGIC (this << "state: " << m_state);
+      NS_LOG_LOGIC (this << " state: " << m_state);
     }
 }
 
@@ -389,7 +392,7 @@
 LteSpectrumPhy::AbortRx ()
 {
   NS_LOG_FUNCTION (this);
-  NS_LOG_LOGIC (this << "state: " << m_state);
+  NS_LOG_LOGIC (this << " state: " << m_state);
 
   NS_ASSERT (m_state == RX);
 
@@ -410,7 +413,7 @@
 LteSpectrumPhy::EndRx ()
 {
   NS_LOG_FUNCTION (this);
-  NS_LOG_LOGIC (this << "state: " << m_state);
+  NS_LOG_LOGIC (this << " state: " << m_state);
 
   NS_ASSERT (m_state == RX);
 
--- a/src/lte/model/lte-ue-net-device.cc	Tue Mar 15 11:22:52 2011 +0100
+++ b/src/lte/model/lte-ue-net-device.cc	Tue Mar 15 20:01:50 2011 +0100
@@ -144,6 +144,9 @@
 {
   NS_LOG_FUNCTION (this << enb);
   m_targetEnb = enb;
+
+  // WILD HACK - should go through RRC and then through PHY SAP
+  m_phy->DoSetCellId (enb->GetCellId ());
 }
 
 
--- a/src/lte/model/lte-ue-net-device.h	Tue Mar 15 11:22:52 2011 +0100
+++ b/src/lte/model/lte-ue-net-device.h	Tue Mar 15 20:01:50 2011 +0100
@@ -100,6 +100,8 @@
   Ptr<LteUeMac> m_mac;
   Ptr<LteUePhy> m_phy;
   Ptr<LteUeRrc> m_rrc;
+
+
 };
 
 } // namespace ns3
--- a/src/lte/model/lte-ue-phy.cc	Tue Mar 15 11:22:52 2011 +0100
+++ b/src/lte/model/lte-ue-phy.cc	Tue Mar 15 20:01:50 2011 +0100
@@ -365,9 +365,11 @@
 
 
 void
-LteUePhy::SetTargetEnb (Ptr<LteEnbPhy> enbPhy)
+LteUePhy::SetEnbCellId (uint16_t cellId)
 {
-  m_targetEnbPhy = enbPhy;
+  m_enbCellId = cellId;
+  m_downlinkSpectrumPhy->SetCellId (cellId);
+  m_uplinkSpectrumPhy->SetCellId (cellId);
 }
 
 
--- a/src/lte/model/lte-ue-phy.h	Tue Mar 15 11:22:52 2011 +0100
+++ b/src/lte/model/lte-ue-phy.h	Tue Mar 15 20:01:50 2011 +0100
@@ -145,12 +145,11 @@
 
 
   /** 
-   * set the eNB this PHY is synchronized with 
+   * set the cellId of the eNb this PHY is synchronized with 
    * 
-   * \param enbPhy a pointer to the PHY of the eNB, used for exchanging control messages
    * \param cellId the cell identifier of the eNB
    */
-  void SetTargetEnb (Ptr<LteEnbPhy> enbPhy);    
+  void SetEnbCellId (uint16_t cellId);    
 
 
 private:
@@ -165,8 +164,7 @@
 
   uint16_t  m_rnti;
 
-  Ptr<LteEnbPhy> m_targetEnbPhy;  
-  uint16_t m_cellId;
+  uint16_t m_enbCellId;
   
 };