Add testing (RRC, PDCP and MAC) entities
authorManuel Requena <manuel.requena@cttc.es>
Tue, 13 Sep 2011 16:59:31 +0200
changeset 8371 08cd993e7910
parent 8370 8da475cb8a8b
child 8372 b4eef897061f
Add testing (RRC, PDCP and MAC) entities
src/lte/test/lte-test-entities.cc
src/lte/test/lte-test-entities.h
src/lte/wscript
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lte/test/lte-test-entities.cc	Tue Sep 13 16:59:31 2011 +0200
@@ -0,0 +1,382 @@
+/* -*-  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>
+ */
+
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+
+#include "ns3/lte-rlc-header.h"
+#include "ns3/lte-pdcp-header.h"
+
+#include "ns3/lte-test-entities.h"
+
+NS_LOG_COMPONENT_DEFINE ("LteTestEntities");
+
+using namespace ns3;
+
+
+/////////////////////////////////////////////////////////////////////
+
+TypeId
+LteTestRrc::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::LteTestRrc")
+    .SetParent<Object> ()
+    .AddConstructor<LteTestRrc> ()
+    ;
+
+  return tid;
+}
+
+LteTestRrc::LteTestRrc ()
+{
+  NS_LOG_FUNCTION (this);
+  m_pdcpSapUser = new LtePdcpSpecificLtePdcpSapUser<LteTestRrc> (this);
+  Simulator::ScheduleNow (&LteTestRrc::Start, this);
+}
+
+LteTestRrc::~LteTestRrc ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteTestRrc::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_pdcpSapUser;
+}
+
+void
+LteTestRrc::SetLtePdcpSapProvider (LtePdcpSapProvider* s)
+{
+  m_pdcpSapProvider = s;
+}
+
+LtePdcpSapUser*
+LteTestRrc::GetLtePdcpSapUser (void)
+{
+  return m_pdcpSapUser;
+}
+
+
+std::string
+LteTestRrc::GetDataReceived (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  return m_receivedData;
+}
+
+
+/**
+ * PDCP SAP
+ */
+
+void
+LteTestRrc::DoReceiveRrcPdu (Ptr<Packet> p)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_LOGIC ("PDU received = " << (*p));
+
+  uint32_t dataLen = p->GetSize ();
+  uint8_t *buf = new uint8_t[dataLen];
+  p->CopyData (buf, dataLen);
+  m_receivedData = std::string ((char *)buf, dataLen);
+
+  NS_LOG_LOGIC (m_receivedData);
+
+  delete [] buf;
+}
+
+/**
+ * START
+ */
+
+void
+LteTestRrc::Start ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteTestRrc::SendData (Time at, std::string dataToSend)
+{
+  NS_LOG_FUNCTION (this);
+
+  LtePdcpSapProvider::TransmitRrcPduParameters p;
+  p.rnti = 111;
+  p.lcid = 222;
+
+  NS_LOG_LOGIC ("Data(" << dataToSend.length () << ") = " << dataToSend.data ());
+  p.rrcPdu = Create<Packet> ((uint8_t *) dataToSend.data (), dataToSend.length ());
+
+  NS_LOG_LOGIC ("Packet(" << p.rrcPdu->GetSize () << ")");
+  Simulator::Schedule (at, &LtePdcpSapProvider::TransmitRrcPdu, m_pdcpSapProvider, p);
+  Simulator::Run ();
+}
+
+/////////////////////////////////////////////////////////////////////
+
+TypeId
+LteTestPdcp::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::LteTestPdcp")
+    .SetParent<Object> ()
+    .AddConstructor<LteTestPdcp> ()
+    ;
+
+  return tid;
+}
+
+LteTestPdcp::LteTestPdcp ()
+{
+  NS_LOG_FUNCTION (this);
+  m_rlcSapUser = new LteRlcSpecificLteRlcSapUser<LteTestPdcp> (this);
+  Simulator::ScheduleNow (&LteTestPdcp::Start, this);
+}
+
+LteTestPdcp::~LteTestPdcp ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteTestPdcp::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_rlcSapUser;
+}
+
+void
+LteTestPdcp::SetLteRlcSapProvider (LteRlcSapProvider* s)
+{
+  m_rlcSapProvider = s;
+}
+
+LteRlcSapUser*
+LteTestPdcp::GetLteRlcSapUser (void)
+{
+  return m_rlcSapUser;
+}
+
+
+std::string
+LteTestPdcp::GetDataReceived (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  return m_receivedData;
+}
+
+
+/**
+ * RLC SAP
+ */
+
+void
+LteTestPdcp::DoReceivePdcpPdu (Ptr<Packet> p)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_LOGIC ("PDU received = " << (*p));
+
+  uint32_t dataLen = p->GetSize ();
+  uint8_t *buf = new uint8_t[dataLen];
+  p->CopyData (buf, dataLen);
+  m_receivedData = std::string ((char *)buf, dataLen);
+
+  NS_LOG_LOGIC (m_receivedData);
+
+  delete [] buf;
+}
+
+/**
+ * START
+ */
+
+void
+LteTestPdcp::Start ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteTestPdcp::SendData (Time at, std::string dataToSend)
+{
+  NS_LOG_FUNCTION (this);
+
+  LteRlcSapProvider::TransmitPdcpPduParameters p;
+  p.rnti = 111;
+  p.lcid = 222;
+
+  NS_LOG_LOGIC ("Data(" << dataToSend.length () << ") = " << dataToSend.data ());
+  p.pdcpPdu = Create<Packet> ((uint8_t *) dataToSend.data (), dataToSend.length ());
+
+  NS_LOG_LOGIC ("Packet(" << p.pdcpPdu->GetSize () << ")");
+  Simulator::Schedule (at, &LteRlcSapProvider::TransmitPdcpPdu, m_rlcSapProvider, p);
+  Simulator::Run ();
+}
+
+/////////////////////////////////////////////////////////////////////
+
+TypeId
+LteTestMac::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::LteTestMac")
+    .SetParent<Object> ()
+    .AddConstructor<LteTestMac> ()
+    ;
+
+  return tid;
+}
+
+LteTestMac::LteTestMac ()
+{
+  NS_LOG_FUNCTION (this);
+  m_macSapProvider = new EnbMacMemberLteMacSapProvider<LteTestMac> (this);
+  m_macSapUser = 0;
+  m_macLoopback = 0;
+  m_pdcpHeaderPresent = false;
+  m_txOpportunityMode = MANUAL_MODE;
+//   m_cmacSapProvider = new EnbMacMemberLteEnbCmacSapProvider (this);
+//   m_schedSapUser = new EnbMacMemberFfMacSchedSapUser (this);
+//   m_cschedSapUser = new EnbMacMemberFfMacCschedSapUser (this);
+//   m_enbPhySapUser = new EnbMacMemberLteEnbPhySapUser (this);
+}
+
+LteTestMac::~LteTestMac ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteTestMac::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_macSapProvider;
+//   delete m_cmacSapProvider;
+//   delete m_schedSapUser;
+//   delete m_cschedSapUser;
+//   delete m_enbPhySapUser;
+}
+
+void
+LteTestMac::SetLteMacSapUser (LteMacSapUser* s)
+{
+  m_macSapUser = s;
+}
+
+LteMacSapProvider*
+LteTestMac::GetLteMacSapProvider (void)
+{
+  return m_macSapProvider;
+}
+
+void
+LteTestMac::SetLteMacLoopback (Ptr<LteTestMac> s)
+{
+  m_macLoopback = s;
+}
+
+std::string
+LteTestMac::GetDataReceived (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  return m_receivedData;
+}
+
+void
+LteTestMac::SendTxOpportunity (uint32_t bytes)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_LOGIC ("Bytes = " << bytes);
+
+  Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportunity, m_macSapUser, bytes);
+  Simulator::Run ();
+}
+
+void
+LteTestMac::SetPdcpHeaderPresent (bool present)
+{
+  NS_LOG_FUNCTION (this);
+  m_pdcpHeaderPresent = present;
+}
+
+void
+LteTestMac::SetTxOpportunityMode (uint8_t mode)
+{
+  NS_LOG_FUNCTION (this);
+  m_txOpportunityMode = mode;
+}
+
+
+/**
+ * MAC SAP
+ */
+
+void
+LteTestMac::DoTransmitPdu (LteMacSapProvider::TransmitPduParameters params)
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_macLoopback)
+    {
+      Simulator::Schedule (Seconds (0.1), &LteMacSapUser::ReceivePdu,
+                           m_macLoopback->m_macSapUser, params.pdu);
+    }
+  else
+    {
+      LteRlcHeader rlcHeader;
+      LtePdcpHeader pdcpHeader;
+
+      // Remove RLC header
+      params.pdu->RemoveHeader (rlcHeader);
+      NS_LOG_LOGIC ("RLC header: " << rlcHeader);
+
+      // Remove PDCP header, if present
+      if (m_pdcpHeaderPresent)
+        {
+          params.pdu->RemoveHeader (pdcpHeader);
+          NS_LOG_LOGIC ("PDCP header: " << pdcpHeader);
+        }
+
+      // Copy data to a string
+      uint32_t dataLen = params.pdu->GetSize ();
+      uint8_t *buf = new uint8_t[dataLen];
+      params.pdu->CopyData (buf, dataLen);
+      m_receivedData = std::string ((char *)buf, dataLen);
+
+      NS_LOG_LOGIC ("Data (" << dataLen << ") = " << m_receivedData);
+      delete [] buf;
+    }
+}
+
+void
+LteTestMac::DoReportBufferStatus (LteMacSapProvider::ReportBufferStatusParameters params)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_LOGIC ("Queue size = " << params.txQueueSize);
+
+  if ((m_txOpportunityMode == AUTOMATIC_MODE) && params.txQueueSize)
+    {
+      Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportunity,
+                           m_macSapUser, params.txQueueSize + 2); // TODO Including RLC header size??? Not clean
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lte/test/lte-test-entities.h	Tue Sep 13 16:59:31 2011 +0200
@@ -0,0 +1,202 @@
+/* -*-  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>
+ */
+
+#ifndef LTE_TEST_ENTITIES_H
+#define LTE_TEST_ENTITIES_H
+
+#include "ns3/test.h"
+// #include "ns3/type-id.h"
+
+#include "ns3/lte-mac-sap.h"
+#include "ns3/lte-rlc-sap.h"
+#include "ns3/lte-pdcp-sap.h"
+
+
+using namespace ns3;
+
+
+/**
+ * This class implements a testing RRC entity
+ */
+class LteTestRrc : public Object
+{
+    friend class LtePdcpSpecificLtePdcpSapUser<LteTestRrc>;
+//   friend class EnbMacMemberLteEnbCmacSapProvider;
+//   friend class EnbMacMemberLteMacSapProvider<LteTestMac>;
+//   friend class EnbMacMemberFfMacSchedSapUser;
+//   friend class EnbMacMemberFfMacCschedSapUser;
+//   friend class EnbMacMemberLteEnbPhySapUser;
+
+  public:
+    static TypeId GetTypeId (void);
+
+    LteTestRrc (void);
+    virtual ~LteTestRrc (void);
+    virtual void DoDispose (void);
+
+
+    /**
+    * \brief Set the PDCP SAP provider
+    * \param s a pointer to the PDCP SAP provider
+    */
+    void SetLtePdcpSapProvider (LtePdcpSapProvider* s);
+    /**
+    * \brief Get the PDCP SAP user
+    * \return a pointer to the SAP user of the RLC
+    */
+    LtePdcpSapUser* GetLtePdcpSapUser (void);
+
+    void Start ();
+
+    void SendData (Time at, std::string dataToSend);
+    std::string GetDataReceived (void);
+
+  private:
+    // Interface forwarded by LtePdcpSapUser
+    virtual void DoReceiveRrcPdu (Ptr<Packet> p);
+
+    LtePdcpSapUser* m_pdcpSapUser;
+    LtePdcpSapProvider* m_pdcpSapProvider;
+
+    std::string m_receivedData;
+
+};
+
+/////////////////////////////////////////////////////////////////////
+
+/**
+ * This class implements a testing PDCP entity
+ */
+class LteTestPdcp : public Object
+{
+    friend class LteRlcSpecificLteRlcSapUser<LteTestPdcp>;
+//   friend class EnbMacMemberLteEnbCmacSapProvider;
+//   friend class EnbMacMemberLteMacSapProvider<LteTestMac>;
+//   friend class EnbMacMemberFfMacSchedSapUser;
+//   friend class EnbMacMemberFfMacCschedSapUser;
+//   friend class EnbMacMemberLteEnbPhySapUser;
+
+  public:
+    static TypeId GetTypeId (void);
+
+    LteTestPdcp (void);
+    virtual ~LteTestPdcp (void);
+    virtual void DoDispose (void);
+
+
+    /**
+    * \brief Set the RLC SAP provider
+    * \param s a pointer to the RLC SAP provider
+    */
+    void SetLteRlcSapProvider (LteRlcSapProvider* s);
+    /**
+    * \brief Get the RLC SAP user
+    * \return a pointer to the SAP user of the RLC
+    */
+    LteRlcSapUser* GetLteRlcSapUser (void);
+
+    void Start ();
+
+    void SendData (Time at, std::string dataToSend);
+    std::string GetDataReceived (void);
+
+  private:
+    // Interface forwarded by LteRlcSapUser
+    virtual void DoReceivePdcpPdu (Ptr<Packet> p);
+
+    LteRlcSapUser* m_rlcSapUser;
+    LteRlcSapProvider* m_rlcSapProvider;
+
+    std::string m_receivedData;
+
+};
+
+/////////////////////////////////////////////////////////////////////
+
+/**
+ * This class implements a testing loopback MAC layer
+ */
+class LteTestMac : public Object
+{
+//   friend class EnbMacMemberLteEnbCmacSapProvider;
+    friend class EnbMacMemberLteMacSapProvider<LteTestMac>;
+//   friend class EnbMacMemberFfMacSchedSapUser;
+//   friend class EnbMacMemberFfMacCschedSapUser;
+//   friend class EnbMacMemberLteEnbPhySapUser;
+
+  public:
+    static TypeId GetTypeId (void);
+
+    LteTestMac (void);
+    virtual ~LteTestMac (void);
+    virtual void DoDispose (void);
+
+    void SendTxOpportunity (uint32_t);
+    std::string GetDataReceived (void);
+
+    /**
+     * \brief Set the MAC SAP user
+     * \param s a pointer to the MAC SAP user
+     */
+    void SetLteMacSapUser (LteMacSapUser* s);
+    /**
+     * \brief Get the MAC SAP provider
+     * \return a pointer to the SAP provider of the MAC
+     */
+    LteMacSapProvider* GetLteMacSapProvider (void);
+
+    /**
+     * \brief Set the other side of the MAC Loopback
+     * \param s a pointer to the other side of the MAC loopback
+     */
+    void SetLteMacLoopback (Ptr<LteTestMac> s);
+
+    /**
+     *
+     */
+    void SetPdcpHeaderPresent (bool present);
+
+    /**
+     *
+     */
+    void SetTxOpportunityMode (uint8_t mode);
+
+    typedef enum {
+      MANUAL_MODE     = 0,
+      AUTOMATIC_MODE  = 1
+    } TxOpportunityMode_t;
+
+  private:
+    // forwarded from LteMacSapProvider
+    void DoTransmitPdu (LteMacSapProvider::TransmitPduParameters);
+    void DoReportBufferStatus (LteMacSapProvider::ReportBufferStatusParameters);
+
+    LteMacSapProvider* m_macSapProvider;
+    LteMacSapUser* m_macSapUser;
+    Ptr<LteTestMac> m_macLoopback;
+
+    std::string m_receivedData;
+
+    bool m_pdcpHeaderPresent;
+    bool m_txOpportunityMode;
+
+};
+
+#endif /* LTE_TEST_MAC_H */
--- a/src/lte/wscript	Fri Sep 09 17:58:15 2011 +0200
+++ b/src/lte/wscript	Tue Sep 13 16:59:31 2011 +0200
@@ -73,6 +73,7 @@
         'test/lte-test-pf-ff-mac-scheduler.cc',
         'test/lte-test-earfcn.cc',
         'test/lte-test-spectrum-value-helper.cc',
+        'test/lte-test-entities.cc',
         'test/lte-test-rlc-um-transmitter.cc',
         'test/epc-test-gtpu.cc',
         'test/test-eps-tft-classifier.cc',
@@ -143,7 +144,7 @@
         'test/lte-test-ue-phy.h',
         'test/lte-test-rr-ff-mac-scheduler.h',
         'test/lte-test-pf-ff-mac-scheduler.h',
-        'test/lte-test-pf-ff-mac-scheduler.h',
+        'test/lte-test-entities.h',
         'test/lte-test-rlc-um-transmitter.h',
         'test/epc-test-gtpu.h',
         'model/lte-tft.h',